最近把一个比较旧的业余项目重新升级了下,将主文件进行了剥离,增加了些惰性加载的配置,将过程中一些零散的知识点做个总结,同时尽量深入原理实现层面。

项目环境:

前端框架:angular2.0.0-beta.21

构建工具:webpack4.11.0

加载惰性模块:

跑了下环境,再次验证了每次回头看以前自己写的东东的时候都会不能忍这一潜在的法则,发现首屏的加载事件竟然超过了1s,于是果断切割主资源包,进行按需加载

如果使用angular-cli命令工具,该需求基本自动化实现,只需要在对应的路由下配置需要懒加载的模块即可,其他工作如模块的异步加载等,cli会进行自动处理,如下所示


const routes: Routes = [
{
path: 'customers',
loadChildren: './customers/customers.module#CustomersModule'
}
];

但是一直偏向于自己构建脚手架,不喜欢拿来即用,看了下angular-cli的源码,其实也是基于webpack构建(部分配置如下),只是没看到其中异步加载模块和output输出中模块语义化的实现过程。只能自己实现模块的异步加载,解决“can not find module...”报错。


{
resolve: {
extensions: ['.ts', '.js'],
symlinks: !buildOptions.preserveSymlinks,
modules: [appRoot, 'node_modules'],
alias
},
resolveLoader: {
modules: loaderNodeModules
},
context: projectRoot,
entry: entryPoints,
output: {
path: path.resolve(buildOptions.outputPath),
publicPath: buildOptions.deployUrl,
filename: `[name].bundle.js`,
chunkFilename: `[id]${hashFormat.chunk}.chunk.js`
},
module: {
rules: [
{ test: /\.html$/, loader: 'raw-loader' },
{
test: /\.(eot|svg|cur)$/,
loader: 'file-loader',
options: {
name: `[name]${hashFormat.file}.[ext]`,
limit: 10000
}
},
{
test: /\.(jpg|png|webp|gif|otf|ttf|woff|woff2|ani)$/,
loader: 'url-loader',
options: {
name: `[name]${hashFormat.file}.[ext]`,
limit: 10000
}
}
].concat(extraRules)
},
plugins: [
new webpack.NoEmitOnErrorsPlugin()
].concat(extraPlugins)
}

查阅webpack文档,找到一个内置的ensure方法可实现模块异步,使用如下


require.ensure(dependencies: String[], callback: function(require), errorCallback: function(error), chunkName: String)

dependencies:字符串构成的数组,声明 callback 回调函数中所需的所有模块。

callback:只要加载好全部依赖,webpack 就会执行此函数。require 函数的实现,作为参数传入此函数。当程序运行需要依赖时,可以使用 require() 来加载依赖。函数体可以使用此参数,来进一步执行 require() 模块

errorCallback:当 webpack 加载依赖失败时,会执行此函数。

chunkName:由 require.ensure() 创建出的 chunk 的名字。通过将同一个 chunkName 传递给不同的 require.ensure() 调用,我们可以将它们的代码合并到一个单独的 chunk 中,从而只产生一个浏览器必须加载的 bundle

将方法应用到路由模块,代码如下:


export const routes: Routes = [
{
path: 'course',
loadChildren: () => new Promise(resolve => {
(require as any).ensure(
[],
require => {
resolve(require('../course/module').CourseModule);
},
'haha'
);
})
}
];

该方法基于浏览器内置promise对象,如果需要兼容多种环境,最好增加polyfill库来填充promise环境

最后

如果不想在路由模块写异步方法,也可以引入一些封装好的插件实现,如es6-promise-loader、angular2-load-children-loader,但其实也没有本质的变化,只不过稍做封装而已,意义不大,具体usage可github查看

先搞这些,依赖包升级乃至换个环境重写等下次再有闲情哈!!

angular惰性加载拓展剖析的更多相关文章

  1. Angular惰性加载的特性模块

    一:Angular-CLI建立应用 cmd命令:ng new lazy-app --routing    (创建一个名叫 lazy-app 的应用,而 --routing 标识生成了一个名叫 app- ...

  2. Angular2 ng2 如何配置惰性加载

    需要修改至少四个地方1. 将子组件进行模块化操作2.生成子组件module .子组件router3.配置主路由 信息 改为loadChild4.配置appModule 删除引入 以product组件 ...

  3. 关于angular5的惰性加载报错问题

    之前为了测试一个模块优化问题,于是用angular-cli快速搭建了个ng5的脚手架demo,在应用惰性加载功能的时候发现浏览器报错如下: ERROR Error: Uncaught (in prom ...

  4. angular懒加载的一些坑

    写在前面 最近在工作中接触到angular模块化打包加载的一些内容,感觉中间踩了一些坑,在此标记一下. 项目背景: 项目主要用到angularJs作为前端框架,项目之前发布的时候会把所有的前端脚本打包 ...

  5. 推荐一个 angular 图像加载插件

    推荐一个简单的 Angular 图片加载插件:vgSrc,插件根据图片资源的不同加载状态,显示不同图片,亲测兼容IE-8. 使用 推荐使用 bower 加载: bash bower install v ...

  6. PDF在线阅读 FlexPaper 惰性加载 ;

    关于PDF在线阅读问题,比较普遍的做法是转换成swf文件来浏览:由于项目需要,就用 flexpaper 来实现了下,功能比较简单:但是文件的惰性加载确实让笔者挠头了一把! 下面是笔者的方法: 采用流的 ...

  7. Angular - 预加载 Angular 模块

    Angular - 预加载延迟模块 在使用路由延迟加载中,我们介绍了如何使用模块来拆分应用,在访问到这个模块的时候, Angular 加载这个模块.但这需要一点时间.在用户第一次点击的时候,会有一点延 ...

  8. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格惰性加载节点

    jQuery EasyUI 树形菜单 - 树形网格惰性加载节点 有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载 ...

  9. angular 图片加载失败 情况处理? 如何在ionic中加载本地图片 ?

    1.angular 图片加载失败 情况处理 在directive中定义组件,在ng-src错误时,调用err-src app.directive('errSrc',function(){ return ...

随机推荐

  1. 关于 WebBrowser调用百度地图API 鼠标滚轮缩放地图级别失灵的解决办法

    在桌面程序下 百度地图API的鼠标缩放地图功能可能会失灵无效! 这个原因不是API的问题 小弟试了下在WEB上面是没有问题的 于是考虑可能是WebBrowser的获取焦点问题,于是在主窗体 添加了一个 ...

  2. swoole udp

    server.php <?php $server = new swoole_server('127.0.0.1', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); ...

  3. python爬虫对于gb2312

    对于刚刚接触python爬虫的人,常常会碰到一个比较烦的问题, 如果网页是GB2312编码格式,我们直接decode(’GB2312‘)一般python都会报错: GB2312不能编码该页面. 这就比 ...

  4. source的简单操作

    source五部曲 git工作流:建立新功能 更改文件后,提交 点击git工作流完成新功能 点击推送 点击拉取

  5. C++矩阵库 Eigen 快速入门

    最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...

  6. Linux基础命令---e2fsck

    ex2fsck 检查ext2.ext3.ext4文件系统,如果系统已经挂载了,那么不建议去检查,因为这样是不安全的.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.op ...

  7. javascript中的console.log有什么作用?

    javascript中的console.log有什么作用? 主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是:他能看到结构话的东西,如果是alert ...

  8. redis 哨兵机制环境搭建

    Redis哨兵机制,一主二从 注:Redis哨兵切换,建议一主多从 一.一主二从 教程步骤:https://www.cnblogs.com/zwcry/p/9046207.html 二.哨兵配置(se ...

  9. (三)github之GIT的导入

    什么是版本管理? git是一款[分散型版本管理]软件,提供了开发过程中不可少的功能,例如记录一款软件添加或者更改源代码的过程,回溯到特定阶段,恢复误删除的文件等. 集中型:将仓库集中放在服务器中,一旦 ...

  10. php打印负载函数、Linux awk打印负载

    php的sys_getloadavg sys_getloadavt()可以获得系统负载情况.该函数返回一个包含三个元素的数组,每个元素分别代表系统再过去的1.5和15分钟内的平均负载. 与其让服务器因 ...