Webpack 可以将代码分割为 chunks(语块),当代码运行到需要它们的时候再加载。
使用场景:
将相同代码抽离到一个共享块
脚本懒加载,使得初始下载的代码更小
懒加载 JS 脚本的方式:
1. CommonJS:require.ensure()
require.ensure([],function(){ var data = require('./test.js') })
复制代码
require.ensure函数是一个代码的分割线,表示回调函数里的require是想要分割出去的文件,形成一个webpack单独打包的 js 文件。第一个参数[],表示的是require.ensure所依赖的其他异步加载的模块。当代码执行时,先下载[]内的依赖,当下载完成再执行回调函数,下载require的所指模块执行。
2. ES6 动态 import
目前还没有原生支持,需要 babel 转换。
// 1. 安装babel插件npm install @babel/plugin-syntax-dynamic-import --save-dev
// 2. 配置.babelrc文件声明{ "presets":[ [ "@babel/preset-env" ], "@babel/preset-react" ], "plugins":[ "@babel/plugin-syntax-dynamic-import" ]}
// 3. 用法// 3.1 声明文件test.jsexport default {a:1}// 3.2 引用文件mounted(){ import('./test.js').then(res=>{ console.log(res.default) })}
复制代码
3. 模拟动态引入
var dynamicImport = (src,callback)=>{ var head = document.getElementsByTagName("head")[0] var script = document.createElement("script"); script.type = "text/javascript"; script.src = src; head.insertBefore(script, head.firstChild); // 监听script加载事件 script.onload = script.onreadystatechange = function() { if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") { console.log("test.js文件加载完成"); typeof callback === 'function' && callback() } } }
复制代码
4. 附录
浅谈Webpack的本质
Loader处理非JavaScript模块详解
Plugin事件流机制详解
浅谈Webpack原理,以及loader和plugin实现
wepback进阶用法1:多入口构建/资源内联/脚本分离等
webpack进阶用法2:代码分割和动态引入的实现方式
webpack进阶用法3:如果将代码打包成一个通用JS库
webpack 进阶用法 4:构建速度和体积优化策略(待发布)
webpack 进阶用法 5:持续集成,Travis CLI 使用(待发布)
评论