热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

详解如何使用webpack+es6开发angular1.x

虽然,现在越来越多的人选择使用react、vue以及ng2,但是依然存在相当一部分人在使用angular1.x开发。本文将介绍如何使用web

虽然,现在越来越多的人选择使用react、vue以及ng2,但是依然存在相当一部分人在使用angular1.x开发。本文将介绍如何使用webpack+es6+angular1.x+$oclazyLoad实现动态加载。

1.webpack

webpack.config.js

var path = require('path');

var webpack = require('webpack');

var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
  entry: {
     home: [
        'babel-polyfill',
         './app/app.js'      //引入文件
      ],
      common: [
           'babel-polyfill',
           'angular', 
            'angular-ui-router', 
            'oclazyload'
        ]
   },
   output: {
     path: path.join(__dirname, '/wap'),
     filename: '[name].js',
     chunkFilename: '[id].build.js?[chunkhash]',
     publicPath: '/wap/',
   },
   module: {
     loaders: [
       {
           test:/\.js?$/,
           loader:'ng-annotate-loader!babel-loader',
           exclude:/node_modules/
       },
       {
        test: /\.html$/,
        loader: 'raw-loader',
        exclude: /node_modules/
       },
     ]
  },
  resolve: {
       root: ['node_modules'],
       extensions: ['', '.js', '.html', '.json'],
       modulesDirectories: ['node_modules'],
       alias: {}
   },
  externals: {},
  plugins: [
          new webpack.HotModuleReplacementPlugin(),
          new ExtractTextPlugin('[name].[contenthash:20].css'),
          new webpack.optimize.UglifyJsPlugin({
               compress: {warnings: false},
               sourceMap: true
          }),
         new webpack.optimize.CommonsChunkPlugin('common', 'common.js')
  ]

}

2.Module

第一步,先引入angular ,以及相关模块,然后像es5中那样定义一个模块

app.js

import angular from 'angular';
import uirouter from 'angular-ui-router';
import ocLazyLoad from 'oclazyLoad';
angular.module('app',[ uirouter,ocLazyLoad ])

模块与模块之间引用

我们建立第二个模块 header/index.js

import angularfrom 'angular';
export default angular.module('header',[]).name

修改app.js

import header from './header'
angular.module('app',[ uirouter,ocLazyLoad , header])

模块的引用完成

3.控制器

假设在header目录下新增一个控制器

header/controller.js

export default class HeaderController {
     consturctor(){
         this.home = 'header'
      }
}

引用控制器 修改 header/index.js

import HeaderController from './controller'
export default angular.module('header',[ ])
   .controller('HeaderController',HeaderController)
   .name

4.服务

如果要在控制器内使用$scope,或者其他服务肯定是报错的,那是因为我们在使用之前没有注入服务

所以第一步应该注入服务

header/controller.js

export default class HeaderController {
   consturctor($scope){
       this.home = 'header'
       $scope.compOnent= 'head'
    }
}
HeaderController.$inject = ['$scope']

那么如何自定义服务呢?

新建 header.server.js

class HeaderServices {
     constructor(){
          this.name = 'cxh'
     }
     getName(){
          return this.name
     }
}

header/index.js

import HeaderService from './service';
export default angular.module('header',[ ])
     .controller('HeaderController',HeaderController)
     .service('HeaderService',HeaderService)
     .name

在控制器中使用自定义服务

header/controller.js

export default class HeaderController {
    consturctor($scope,HeaderService){
         this.home = 'header'
         $scope.compOnent= 'head'
         $scope.name = HeaderService.getName
     }
}
HeaderController.$inject = ['$scope','HeaderService']

5.指令

新建 footer/index.js 大致和 header/index.js相同

将 footer模块 引入到 app.js

新建footer/directive.js

export default class Footer {
     constructor(){
          this.restrict = 'E',
          this.scope = {},
          this.template = "
footer
" this.cOntroller= Foot this.link = (scope, element, attr) => {} } } class Foot{ constructor(){ $scope.alert = () => { alert(1) } } } Header.$inject = ['$scope']

footer/index.js

export default angular.module('footer',[])
.directive('footerDirective',()=> new Footer)
.name

6.路由

router.js

export default router ($stateProvider, $urlRouterProvider) {
    $stateProvider.state("home",{ 
           url:"/home",
           templateUrl:'app/home/home.html',
           controller: "HomeController",
           controllerAs:"HMC",
     })
    $urlRouterProvider.otherwise('/home');
}
router.$inject = [ '$stateProvider', '$urlRouterProvider']

DEMO 实现动态加载

1.第一步,新建app.js创建一个module

import angular from 'angular';
import uirouter from 'angular-ui-router';
import ocLazyLoad from 'oclazyLoad';
//引用创建头部 组件
import Header from './header';
//路由
import routing from "./router.js";
//引入两个子模块
import Home from "./homes";
import Router from "./router";

angular.module('app',[uirouter, Header, ocLazyLoad, Home, Router])
.config(routing)

2.配置路由 ./route.js

export default function routing($stateProvider, $urlRouterProvider) {
 'ngInject'; //注入服务 就不需要使用$inject了
 $stateProvider
   .state("home",{
      url:"/home",
      templateProvider: ($q) => {   //动态引入html模板
        'ngInject';
        let deferred = $q.defer();
        require.ensure([], function () {
          let template = require('./home/home.html');
          deferred.resolve(template);
        });
        return deferred.promise;
       },
       controller: "HomeController",
       controllerAs:"HMC",
       resolve: {      //动态加载模块
         loadMyCtrl: function ($q, $ocLazyLoad) {
            'ngInject';
            let deferred = $q.defer();
            require.ensure([], () => {
                let module = require("./home").default;
                $ocLazyLoad.load({name: module.name});
                deferred.resolve(module.controller)
             });
            return deferred.promise;
          }
      }
   }),
   .state("route",{
     url:"/route",
     templateProvider: ($q) => {   //动态引入html模板
        'ngInject';
        let deferred = $q.defer();
        require.ensure([], function () {
            let template = require('./router/router.html');
            deferred.resolve(template);
         });
         return deferred.promise;
      },
      controller: "routerController",
      controllerAs:"RTC",
      resolve: {      //动态加载模块
         loadMyCtrl: function ($q, $ocLazyLoad) {
           'ngInject';
            let deferred = $q.defer();
            require.ensure([], () => {
               let module = require("./router").default;
               $ocLazyLoad.load({name: module.name});
               deferred.resolve(module.controller)
            });
            return deferred.promise;
       }
   }
 })
$urlRouterProvider.otherwise('/home');
}

3.header

header/index.js

import angular from "angular";
import header from './directive';
export default angular.module('app_header',[])
     .directive('header', () => new header)
     .name;

header/directive.js

class Header {
 constructor($scope){
  'ngInject';
  $scope.isshow = false;
 }
}
export default class header {
  constructor() {
    this.restrict = 'E',
    this.scope = {},
    this.template = require(./header.html) 
    this.cOntroller= Header
    this.link = (scope, element, attr) => {}
  }
}

header/header.html

4.home

home/index.js

import angular from "angular";
import HomeController from './controller';
export default angular.module('app_home',[])
     .controller('HomeController', HomeController)

home/controller.js

export default class HomeController {
 constructor($scope) {
  'ngInject';
  this.isshow = false;
  this.eage = 'sds';
  $scope.edg = 'sma'
 }
 change(){
   this.isshow = !this.isshow;
   console.log(this.isshow);
  }
}

home/home.html

home {{HMC.eage}} -- {{edg}}

其余的模块大同小异就不依依去写了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 在使用 MUI 框架进行应用开发时,开发者常常会遇到 mui.init() 和 mui.plusReady() 这两个方法。本文将详细解释它们的区别及其在不同开发环境下的应用。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 前端开发:从底层到顶端的行业现象解析
    在编程领域,鄙视链现象屡见不鲜,从C语言到Java、.NET等,每个技术栈都有其独特地位。然而,前端开发者尽管常处于鄙视链底端,却在市场需求中备受青睐。本文深入探讨这一现象,并分析前端工程师如何在竞争激烈的市场中脱颖而出。 ... [详细]
  • 本文详细介绍了Ionic框架的使用方法及其与Angular的集成。Ionic框架是一个强大的前端开发工具,适用于构建跨平台的移动应用程序。文章将探讨如何引入必要的CSS和JavaScript文件,并解释bundle.js中包含的核心功能,如路由等。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 在网页开发中,页面加载速度是一个关键的用户体验因素。为了提升加载效率,避免在PageLoad事件中进行大量数据绑定操作,可以采用异步加载和特定控件来优化页面加载过程。 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
author-avatar
mobiledu2502855777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有