webpack学习第十二步——代码分割

2020-02-14  本文已影响0人  Love小六六

打包命令

"scripts": {
    "dev": "webpack --config ./config/webpack.dev.js",
    "start": "webpack-dev-server --config ./config/webpack.dev.js",
    "build": "webpack --config ./config/webpack.prod.js"
}

index.js引入lodash

npm install lodash -D
import _ from  'lodash'

console.log(_.join(['a','b','c'],'***'))

写代码时的代码分割

// 导入import 文件,并且将lodash挂载到window对象上
import _ from 'lodash'
window._ = _
// 不需要import lodash,可直接使用_
console.log(_.join(['a','b','c'],'***'))
// 打包的入口文件改为两个,单独打包lodash
entry: {
    lodash: './src/lodash.js',
    main: './src/index.js',
},

利用webpack实现代码分割

// 导入lodash
import _ from 'lodash'
console.log(_.join(['a','b','c'],'***'))
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin')

module.exports = {
    entry: {
         // 打包index.js文件
        main: './src/index.js',
    },
    module: {
        rules: [{
            test: /\.(jpg|png|gif)$/,
            use: {
                loader: "url-loader",
                options: {
                    name: '[name]_[hash].[ext]',
                    outputPath: 'images/',
                    limit: 2048
                }
            }
        },{
            test: /\.css$/,
            use: [
                'style-loader',
                'css-loader',
                'postcss-loader'
            ]
        },{
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
        }]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: 'src/index.html'
        }),
        new CleanWebpackPlugin({
            root: path.resolve(__dirname, '../')
        }),
    ],
    output: {
        path: path.resolve(__dirname, '../build'),
        filename: '[name].js'
    },
    optimization: {
    // 设置splitChunks
        splitChunks: {
            chunks: "all"
        }
    }
}

异步import的代码分割

npm install @babel/plugin-syntax-dynamic-import -D
{
  "presets": [
    [
      "@babel/preset-env",{
        "targets": {
          "chrome": "67"
        },
        "useBuiltIns": "usage"
      }
    ],
    "@babel/preset-react"
  ],
  // 使用异步 import 插件
  "plugins": ["@babel/plugin-syntax-dynamic-import"]
}

function getComponent() {
    return import('lodash').then(({ default: _ }) => {
        var element = document.createElement('div')
        element.innerHTML =_.join(['a','b','c'],'***')
        return element
    })
}
getComponent().then(element => document.body.appendChild(element))
function getComponent() {
// 通过这种注解生成chunkname,将生成的chunk文件指定文件名为lodash
    return import(/* webpackChunkName:'lodash' */'lodash').then(( _ ) => {
        var element = document.createElement('div')
        element.innerHTML =_.join(['a','b','c'],'***')
        return element
    })
}
getComponent().then(element => document.body.appendChild(element))

splitChunks配置项

optimization: {
    splitChunks: {
        chunks: "all",
        cacheGroups: {
            vendors: false,
            default: false
        }
    }
}

splitChunks默认配置项

optimization: {
    // splitChunks: {},
    // 等价于
    splitChunks: {
        chunks: 'async',
        minSize: 30000,
        maxSize: 0,
        minChunks: 1,
        maxAsyncRequests: 5,
        maxInitialRequests: 3,
        automaticNameDelimiter: '~',
        name: true,
        cacheGroups: {
            vendors: {
                test: /[\\/]node_modules[\\/]/,
                priority: -10
            },
            default: {
                minChunks: 2,
                priority: -20,
                reuseExistingChunk: true
            }
        }
    }
}

chunks配置

minSize 配置

minSize: 30000

maxSize 配置

// 引入的模块大于1个字节才做split
minSize: 1,
// 引入的a.js限定了最大值,超过就会对文件进行二次拆分
maxSize: 2,

minChunks

minChunks: 2
entry: {
    main: './src/index.js',
    other: './src/other.js'
}

多个文件

vendors: {
    test: /[\\/]node_modules[\\/]/,
    priority: -10,
    name: "vendors"
}
vendors: {
    test: /[\\/]node_modules[\\/]/,
    priority: -10,
    //name: "vendors"
}

其他配置

// 同时加载的模块数最多5个,超过5个不做代码分割
maxAsyncRequests: 5,
// 入口文件引入的文件最多三个代码分割
maxInitialRequests: 3,
// 生成文件名称连接符
automaticNameDelimiter: '~',
// cacheGroups 里 filename 有效
name: true,
default: {
    // minChunks: 2,
    // 优先级低于-10,所以node_modules里面用vendors
    priority: -20,
    // 一个模块已经被引用过,就直接复用,不用再打包
    reuseExistingChunk: true,
    filename: "common.js"
},
上一篇 下一篇

猜你喜欢

热点阅读