es6+angular1.X+webpack 實現按路由功能打包項目

需求來源

以前使用jspm來打包項目 可是有個最大的缺點,就是隻能把項目打包成一個大的js,當項目開發到後期會很大,網上找了好久也沒找到合理的jspm打包方式。 因此開始調研能夠打包angular項目成多個文件的工具.html

調研過程

過程當中看了些 vue,react配合webpack按路由功能打包的demo,感受webpack對於打包成多個文件比較擅長。vue

結果

第一步 核心模塊依賴加載

#core.module.js //核心模塊

import 'angular-route'; //官方路由依賴
import 'oclazyLoad' //angular異步加載依賴
import CoreRouter from './core.router'
import LoginModule from '../states/login/login.module' //登入模塊定義js

export default angular.module('xxx.bg',[
    'ngRoute', 
    'oc.lazyLoad', 
    LoginModule.name, 
])
.config(CoreRouter) //主要是路由配置文件

第二步 路由配置

#core.router.js //這裏不是重點,只是通常的配置

import LoginRouter from '../states/login/login.route' //登入路由定義js 

function CoreRouter($routeProvider) {
    $routeProvider
        .when('/login',LoginRouter)
        .otherwise({redirectTo: '/login'});
}

CoreRouter.$inject = ['$routeProvider'];

export default CoreRouter;

第三步 異步請求路由控制器的js

#login.route.js //最重要的操做都在這裏

import LoginTpl from './login.tpl.html' //模板 用webpack的raw-loader加載成文本字符串,具體配置看

let LoginRoute = {
    template    :   LoginTpl,
    controller  :  'LoginCtrl',  //這裏只是寫了一個字符串
    resolve: {
        load: ['$q','$ocLazyLoad',function ($q,$ocLazyLoad) {
            return $q((resolve) => {
                //下面這一行寫法是webpack在須要的時候才下載依賴的模塊,[具體看這裏][2]
                require.ensure([], () => {
                    //這裏只是依賴了一個控制器文件,可是這個文件裏面你能夠import不少其餘的依賴
                    let module = require('./login.controller'); 
                    
                    //加載模塊名爲xxx.bg.login的模塊,具體是什麼做用沒弄明白,請高手解答
                    $ocLazyLoad.load({name: 'xxx.bg.login'}); 
                    
                    //promise 的成功回調,不返回出去參數也不要緊,由於在login.contorller.js裏面已經註冊了LoginCtrl
                    resolve(module.controller); 
                });
            });
        }]
    }
};
export default LoginRoute;

其餘文件

#login.module.js

export default angular.module('xxx.bg.login',[]);
#login.controller.js //這就是第三步異步請求的js webpack會把這個js和它依賴到的js打包成一個js

import './login.module'
import '../../../lib/echarts/echarts.min' //隨便引入了一個百度圖表 比較大的js 超過100K webpack會報警,須要在配置中設置

export default angular.module('xxx.bg.login')
    //註冊控制器
    .controller('LoginCtrl',['$rootScope',
        function($rootScope){
            $rootScope.theme = {name:'login-page'};
    }])
#webpack.config.js
var path = require('path')
module.exports = {
  entry: './source/com.xxx.bg/main.js', //項目入口文件
  output: {
    path: './dist/public',
    publicPath: './public/',
    filename: 'bundle.js'
  },
  resolve: {
    extensions: ['', '.js'],
    alias: {
      'src': path.resolve(__dirname, '../source')
    }
  },
  resolveLoader: {
    root: path.join(__dirname, 'node_modules'),
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules|lib/,
        loader: 'babel-loader?stage=0',
        query: {compact: false}
      },
      {
        test: /\.html$/,
        exclude: /node_modules/,
        loader: 'raw-loader?stage=0'
      }
    ]
  }
};
相關文章
相關標籤/搜索