视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2020-11-27 22:32:31 责编:小采
文档

需求来源

之前使用jspm来打包项目 但是有个最大的缺点,就是只能把项目打包成一个大的js,当项目开发到后期会很大,网上找了很久也没找到合理的jspm打包方式。 所以开始调研可以打包angular项目成多个文件的工具.

调研过程

过程中看了些 vue,react配合webpack按路由功能打包的demo,感觉webpack对于打包成多个文件比较擅长。

结果

第一步 核心模块依赖加载

#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'
 }
 ]
 }
};

下载本文
显示全文
专题