代码分割和webpack无关html
1.webpack中实现代码分割的两种方式node
打开src目录下建立的index.jswebpack
安装第三方包:npm install lodash --saveweb
在index.js里引入npm
import _form "lodash"babel
console.log(_.join(['a', 'b', 'c'],*********))app
第一个参数是字符串链接 第二个参数是链接符异步
打印结果为abc***********async
假如改了咱们的业务逻辑代码,用户须要从新加载main.js,才能获取到最新的代码,执行显示内容,意味代码一变动,用户就要从新加载2MB内容,插件
解决方案:
手动实现代码分割
在src目录下建立一个lodash.js文件
把index.js里的lodah的引入放到lodash文件里
import _form 'lodash'
window.=;
把lodash挂载到全局的window上,这样在控制台其余地方能够直接使用下划线变量了
index.js里直接写业务逻辑就能够
找到webpack.common.js文件进行配置
entry:{
lodash:'./src/lodash.js'
main:'./src/index.js'
}
打包会生成两个文件
一个是main.js 一个是lodash.js
index.html会同时引入main.js和lodash.js
当页面逻辑发生变化时,只要加载main.js便可,加快页面的加载速度
在webpack4里有一个插件:splitChunksPlugin,而且他直接与webpack作了捆绑,不需安装,直接配制使用
1、
配置同步代码,只需在webpack.common.js中作optimization的配置
entry:{
main:"./src/index.js"
}
webpack.common.js中
optimization:{
splitChunks:{
chunks:"all" //帮作代码分割
}
}
打包后生成了一个vendors~main.js文件和main.js文件在dist文件下, vendors ~main.js里面有lodash文件内容
2、
在index.js中异步加载lodash文件
function getComponent(){
//打包并不支持下面的这种语法
return import ('lodash').then(({default:_})=>{
var element = document.createElement('div')
element.innerHTML = _.join(['Dell','Lee'],'-')
return element
})
}
getComponent().then((element)=>{
docunment.body.appendChild(element)
})
这样会报错
安装:npm install babel-plugin-dunamic-import-webpack --save-dev
optimization:{
splitChunks:{
chunks:"async", //在咱们作代码分割时,只对异步代码有效,配置"all"会对同步异步一块儿作分割,"inital":对同步代码作分割
minSize:30000,///大于30000才进行代码分割,小于就不进行代码分割
maxSize:0,//能够配也能够不配
minChunks:1, //当一个模块被用了多少次,才进行代码分割
maxAsyncRequest:5,//同时加载的模块最多5个
maxInitialRequest:3, //入口文件引入的库,若是作代码分割,只能3个
automaticNameDelimiter:'~' //文件生成的时候,文件中间有~链接
name:true //打包生成的文件起什么名,cacheGroups里的名字让它有效
cacheGroups:{//当打包同步代码时,上面的参数有效
vendors:{//若是引入的文件大于30KB,
test:/[\/]node_modules[\/]/,//若是从node_modules引入的模块把它打包到wendors.js里
priority:-10, //-10优先级大,文件会被打包到wendors.js里
filename:"vendors.js"
},
default:{
priority:-20,
reuseExistingChunk:true,//若是一个模块已经被打包过了,那再打包会忽略这个模块,直接使用以前被打包的
filename:'common.js'//打包以后生成的文件名
}
}
}
}