webpack 与 code splitting 2

本文介绍Webpack的代码分割功能,包括使用splitChunksPlugin进行同步代码分割,以及如何通过异步import实现自动代码分割,无需额外配置。

前面一篇,我们自己手动进行了代码分割。

我们在使用 webpack 的时候,一般都会使用 code splitting。因为webpack 中有一些插件可以让我们非常容易地进行 code splitting。

在 webpack4 中有一个插件:splitChunksPlugin,并且它直接与webpack 做了捆绑。不需要安装,直接可以配置使用。

下面我们来实验一下。

我们把index.js 改为

import _ from 'lodash'

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

然后,我们在webpack 配置文件里加入一个配置项 optimization,在这个配置项里面我们配置一个 splitChunks,如下。

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');


module.exports = {
  mode: 'development',
  devtool: "cheap-module-source-map",
  devServer: {
    contentBase: './bundle',
    open: true
  },
  entry: {
    main: './src/index.js'
  },
  module: {
    rules: [{
      test: /\.(png|jpg|gif)$/,
      use: {
        loader: 'url-loader',
        options: {
          name: '[name].[ext]',
          outputPath: 'imgs/',
          limit: 20480
        }
      }
    }, {
      test: /\.scss$/,
      use: ['style-loader', {
              loader: 'css-loader',
              options: {
                importLoaders: 2,
                // modules: true
              }
            },
            'sass-loader',
            'postcss-loader']
    }, {
      test: /\.(eot|ttf|svg)$/,
      use: {
        loader: 'file-loader'
      }
    }, {
      test: /\.js$/,
      exclude: /node_modules/,
      loader: 'babel-loader'
    }]
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, 'bundle')
  },
  optimization: {
    splitChunks: {
      chunks: 'all'
    }
  },
  plugins: [new HtmlWebpackPlugin({
    template: 'src/index.html'
  }),new CleanWebpackPlugin()]
}

那我们使用 npm run bundle 打包一下。

就会发现:

生成了两个js 文件,同时这两个js 文件都被html引用了。webpack 自动地把lodash 代码进行了 code splitting。

当然, webpack 中的代码分割不仅可以通过上面的配置项完成,还可以通过另外的方式。

上面我们的index.js 代码,是同步的代码。

同步代码中,webpack 可以使用上面的配置项中的配置,进行分析什么样的模块应该打包成单独的文件进行代码分割。

实际上,我们除了同步地引入模块外还可以异步地引入模块。

下面我们将import 改为异步引入(使用import 函数,该函数返回的是Promise 对象)

在webpack4 中,then 方法,一般我们会写为接收一个 { default: _ } 的参数,这是考虑到Common JS 导出代码的情况,做的兼容。

代码中异步引入 lodash 模块,引入完成后会新增一个元素,然后把它插入到网页中。

function getComponent () {
  return import('lodash').then(
    ({default: _}) => {
      var element = document.createElement('div');
      element.innerHTML = _.join(['h','e'], '**');
      return  element;
    }
  )
}

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

然后我们使用npm run bundle 打包编译,这时编译报错,如下,

意思是import 函数是动态Import ,目前是试验性语法暂时不支持。(google一下解决方法即可,下面是解决方法)

那么,我们需要借助babel 了。我们需要依赖一个babel 插件。(babel-plugin-dynamic-import-webpack)

npm install babel-plugin-dynamic-import-webpack --save-dev

下载完成后,我们还要进行一些配置。

打开项目的babelrc,给它添加一个plugins,如下。

{
  "presets": [
    ["@babel/preset-env",{
      useBuiltIns: 'usage'
    }],
    "@babel/preset-react"
  ],
  "plugins": ["dynamic-import-webpack"]
}

接下来,就可以正常打包了。(异步import 的时候,无需配置webpack (optimizaiton), 异步代码webpack会自动对其进行代码分割)

总结

1. 代码分割与webpack 无关,webpack 提供代码分割的功能

2. 同步代码,可以配置webpack 的optimization 来进行代码分割

3. 异步代码,无需配置webpack ,webpack 自动进行代码分割

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值