WebPack进阶(Webpack和Code Splitting)

安装: npm i lodash --save 

    npm i babel-plugin-dynamic-import-webpack -D

代码分割,和webpack无关,为了提升性能
webpack中实现代码分割,两种方式:

第一种方法:同步代码: 只需要在webpack.common.js中做optimization的配置即可

第二种方法:异步代码(import): 异步代码,无需做任何配置,会自动进行代码分割,放置到新的文件中,如0.js

第一种方法:在 webpack.common.js 中


module.exports = {
    entry: {
        main: './src/index.js'
    },
    
    module: {
        rules: []
    },
    plugins: [],
+    optimization:{
+       splitChunks:{ //启动代码分割,有默认配置项
+            chunks:'all'
+        }  
+    },
    
    output: {}
}

第二种方法在 .babelrc 中:

{
    presets: [
        [
            "@babel/preset-env", {
                targets: {
                    chrome: "67",
                },
                useBuiltIns: 'usage'
            }
        ],
        // "@babel/preset-react"
    ],
    //用来转义像 return import('lodash').then()=>{} 这样的异步import语法
+    plugins: ["dynamic-import-webpack"]
}

详细内容请看官网:code-splitting


SplitChunksPlugin 配置参数详解

安装:npm install --save-dev @babeL/plugin-syntax-dynamic-import

在业务 index.js 中:


 function getComponent() {
    // /* webpackChunkName:"lodash" */  magic-comments
     return import(/* webpackChunkName:"lodash" */ 'lodash').then(({ default: _ }) => {
         var element = document.createElement('div');
         element.innerHTML = _.join(['1', '2'], '-');
         return element;
    })
}

//新写法
async function getComponent() {
     const { default : _ } = await import(/* webpackChunkName:"lodash" */ 'lodash')    
     var element = document.createElement('div');
     element.innerHTML = _.join(['1', '2'], '-');
     return element;
}

 getComponent().then(element => {
     document.body.appendChild(element);
 });

//点击时才加载lodash
document.addEventListener('click', () => {
   getComponent().then(element => {
     document.body.appendChild(element);
   });
})

在 .babelrc 中:

{
    presets: [
        [
            "@babel/preset-env", {
                targets: {
                    chrome: "67",
                },
                useBuiltIns: 'usage'
            }
        ],
        "@babel/preset-react"
    ],
    // 这个官方的更厉害
+    plugins: ["@babeL/plugin-syntax-dynamic-import"]
}

在 webpack.common.js 中:


module.exports = {
    entry: {
        main: './src/index.js'
    },
    
    module: {
        rules: []
    },
    plugins: [],
+    optimization:{
+       splitChunks:{ //启动代码分割,不写有默认配置项
+             chunks: 'all',//参数all/initial/async,只对所有/同步/异步进行代码分割
              minSize: 30000, //大于30kb才会对代码分割
              maxSize: 0,
              minChunks: 1,//打包生成的文件,当一个模块至少用多少次时才会进行代码分割
              maxAsyncRequests: 5,//同时加载的模块数最多是5个
              maxInitialRequests: 3,//入口文件最多3个模块会做代码分割,否则不会
              automaticNameDelimiter: '~',//文件自动生成的连接符
              name: true,
              cacheGroups:{//对同步代码走缓存组
                vendors: {
                  test: /[\\/]node_modules[\\/]/,
                  priority: -10,//谁优先级大就把打包后的文件放到哪个组
                  filename:'vendors.js'
                },
                  default: {
                  minChunks: 2,
                  priority: -20,
                  reuseExistingChunk: true,//模块已经被打包过,就不用再打包,复用之前的就      可以
                  filename:'common.js' //打包之后的文件名   
                }
        }
+        }  
+    },
    
    output: {}
}

详细请看官方文档:split-chunks-plugin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值