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


Posted in Javascript onAugust 16, 2017

虽然,现在越来越多的人选择使用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 = "<div ng-click='alert()'>footer</div>"
          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

<div>
   <a href="#home" rel="external nofollow" >home</a>
   <a href="#router" rel="external nofollow" >router</a>
</div>

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

<div>home {{HMC.eage}} -- {{edg}}</div>

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

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

Javascript 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
javascript开发随笔一 preventDefault的必要
Nov 25 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
Apr 14 Javascript
各种页面定时跳转(倒计时跳转)代码总结
Oct 24 Javascript
JQUERY dialog的用法详细解析
Dec 19 Javascript
原生javascript模仿win8等待提示圆圈进度条
Apr 24 Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 Javascript
Bootstrap页面布局基础知识全面解析
Jun 13 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 Javascript
微信小程序自定义组件
Aug 16 #Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
Aug 16 #Javascript
微信小程序多列选择器range-key使用详解
Mar 30 #Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 #jQuery
微信小程序tabBar底部导航中文注解api详解
Aug 16 #Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 #Javascript
微信小程序开发animation心跳动画效果
Aug 16 #Javascript
You might like
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
浅析Python中的多条件排序实现
2016/06/07 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python os.path模块常用方法实例详解
2018/09/16 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
无偿献血倡议书
2014/04/14 职场文书
小学语文教研活动总结
2014/07/01 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
学生上课说话检讨书
2014/10/25 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
交通事故起诉书
2015/05/19 职场文书
南极大冒险观后感
2015/06/05 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书