es6+angular1.X+webpack 实现按路由功能打包项目的示例


Posted in Javascript onAugust 16, 2017

需求来源

之前使用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'
   }
  ]
 }
};

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

Javascript 相关文章推荐
return false,对阻止事件默认动作的一些测试代码
Nov 17 Javascript
浏览器页面区域大小的js获取方法
Sep 21 Javascript
js实现按一下删除键删除整个单词附demo
Sep 05 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
基于JavaScript实现生成名片、链接等二维码
Sep 20 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
Aug 15 Javascript
详细总结Javascript中的焦点管理
Sep 17 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
Vue2 监听属性改变watch的实例代码
Aug 27 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
Openlayers实现测量功能
Sep 25 Javascript
详解如何使用webpack+es6开发angular1.x
Aug 16 #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
You might like
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
小程序实现分类页
2019/07/12 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python中with及contextlib的用法详解
2017/06/08 Python
详解Python用户登录接口的方法
2019/04/17 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
ajax是什么及其工作原理
2012/02/08 面试题
初中生自我评价
2014/02/01 职场文书
应届毕业生求职信
2014/05/26 职场文书
js之ajax文件上传
2021/05/13 Javascript