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

如何使用webpack+es6开发angular1

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

1.webpack配置

2.模块定义与引用

3.控制器定义与引用

4.服务的定义

5.指令

6.路由

6.demo 使用 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" >home</a>
     <a href="#router">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>

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,083评论 7 35
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,234评论 4 31
  • 姓名:谢新葵 公司:宁波大发化纤有限公司 宁波盛和塾《六项精进》第235期学员感谢二组 【日精进打卡第30天】 知...
    sandy201704阅读 106评论 0 0
  • 育儿分享:“每次跟孩子说话,先看一看自己的内心。问一问自己的内心,此时此刻,我平和吗?我喜悦吗?我相信我所说的话吗...
    沛钰阅读 811评论 0 2