Webpack:代码分割

栏目: 编程语言 · 发布时间: 5年前

内容简介:在当前的前端项目中,常常使用 gulp、webpack、Browserify 等将多个文件压缩合并成一个。这个过程称为打包。 打包是一个将文件引入并合并到一个单独文件的过程,最终形成一个 “bundle”。接着在页面上引入该 bundle,整个应用即可一次性加载。打包是个非常棒的技术,但随着你的应用增长,你的代码包也将随之增长。尤其是在整合了体积巨大的第三方库的情况下。你需要关注你代码包中所包含的代码,以避免因体积过大而导致加载时间过长。为了避免搞出大体积的代码包,在前期就思考该问题并对代码包进行分割是个不

在当前的前端项目中,常常使用 gulp、webpack、Browserify 等将多个文件压缩合并成一个。这个过程称为打包。 打包是一个将文件引入并合并到一个单独文件的过程,最终形成一个 “bundle”。接着在页面上引入该 bundle,整个应用即可一次性加载。

打包是个非常棒的技术,但随着你的应用增长,你的代码包也将随之增长。尤其是在整合了体积巨大的第三方库的情况下。你需要关注你代码包中所包含的代码,以避免因体积过大而导致加载时间过长。

为了避免搞出大体积的代码包,在前期就思考该问题并对代码包进行分割是个不错的选择。代码分割是由诸如 Webpack(代码分割)和 Browserify(factor-bundle)这类打包器支持的一项技术,能够创建多个包并在运行时动态加载。

对应用进行代码分割能够帮助你“懒加载”当前用户所需要的内容,能够显著地提高你的应用性能。尽管并没有减少应用整体的代码体积,但你可以避免加载用户永远不需要的代码,并在初始加载的时候减少所需加载的代码量。

关键点

打包解决了以来文件过多,而导致 http 请求过多的问题

代码分割则是解决打包的副作用——单文件过大,导致加载时间过长。

因此代码分割的关键点在于,如何控制 分割粒度

  • 分割文件多少
  • 文件大小

分割方法

有三种常用的代码分离方法:

entry

entry

每个 entry 都会在最后的打包中输出一个对应的文件。因此可以显示地进行代码分割:

module.exports = {
    entry: {
        app: './src/index.js',
        print: './src/print.js'
    },
    // ...
    output: {
        filename: '[name].[chunkhash].js',
        path: path.resolve(__dirname, './dist')
    }
}
复制代码

进行打包构建后会在 dist 文件夹输出:

app.f7badf83cc90de106d41.js
print.e00bba994e917cc7fc59.js
复制代码

动态导入

动态导入也可以达到代码分割的效果:

import _ from 'lodash';

function component() {
  var element = document.createElement('div');

  // Lodash(目前通过一个 script 脚本引入)对于执行这一行是必需的
  element.innerHTML = _.join(['你好呀', 'webpack'], ' ');

  element.onclick = (e) => import(/* webpackChunkName: "print" */ './print').then((Print) => {
  })

  return element;
}

document.body.appendChild(component());

复制代码

webpackChunkName 设置了输出包的名字。

module.exports = {
    entry: {
        app: './src/index.js'
    },
    // ...
    output: {
        filename: '[name].[chunkhash].js',
        chunkFilename: '[name].[chunkhash].js',
        path: path.resolve(__dirname, './dist')
    }
}
复制代码

outputchunkFilename 决定了非入口(non-entry) chunk 文件的名称。这里的 chunk 是通过代码分割产生的,因此这里通过此选项来设置文件的名字。

运行打包:

app.73efde30ee057cb8c817.js
print.e4408db3b4e5072295de.js
复制代码

插件

CommonsChunkPlugin

在 webpack 4 之前,使用 CommonsChunkPlugin 进行公共 chunk 抽取。

module.exports = {
    entry: './src/index.js',
    entry: {
      main: './src/index.js',
      vendor: [
        'lodash'
      ]
    },
  plugins: [
    new CleanWebpackPlugin(['dist']),
    new HtmlWebpackPlugin({
      title: 'Caching'
    }),
      new webpack.optimize.CommonsChunkPlugin({
        name: 'vendor'
      }),
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest'
    })
  ],
  output: {
    filename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, 'dist')
  }
};
复制代码

这里有两点值得注意:

  • entry 中的 vendor :显式引用 lodash ,由于 index.js 也导入了 lodash ,因此它就变成了一个公共的模块。
  • 使用 new webpack.optimize.CommonsChunkPlugin 抽取这些公共模块

SplitChunksPlugin

webpack 4 之后 CommonsChunkPlugin 被弃用了,使用 SplitChunksPlugin 代替。 SplitChunksPlugin 是开箱即用的,只需要在 module.exports 中进行配置:

module.exports = {
  //...
  optimization: {
    splitChunks: {
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendor',
          chunks: 'initial',
          minChunks: 2
        }
      }
    }
  },
  output: {
    filename: '[name].[chunkhash].js',
    chunkFilename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, './dist')
  }
};
复制代码

上面的配置会将 node_modules 下引用的所有模块都使用 vendor 这个作为 chunk 名以 outputchunkFilename 设置的格式打包到 dist 文件夹中。

SplitChunksPlugin 的选项:

cacheGroups 中每一项都接收如下参数:

  • filename: 重写 chunk 命名方式

    vendors: {
      test: /[\\/]node_modules[\\/]/,
      name: 'vendor',
      filename:'[name].bundle.js'
      chunks: 'initial',
      minChunks: 2,
    }
    复制代码

    最后会生成名字为 vendor.bundle.js 的文件


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

網絡社會之崛起

網絡社會之崛起

曼威·柯司特 / 夏鑄九、王志弘 等 / 唐山 / 2000-11 / NT$550

本書解釋了今日重塑世界的兩股強大但相互衝突的潮流:全球化與認同。資訊科技的革命以及資本主義的再結構已經引動了網絡社會,並帶來了策略,除經濟行為的全球化、工作的彈性化與不穩定,以及真實的虛擬文化。但是,伴隨著資本主義的轉化與國家主義的消亡而來的,是集體認同的表達以火力十足的方式竄起。它們挑戰了全球化中的文化單一性以及對於生活、環境的控制。曼威.柯司特在本書中描繪了社會運動的根源、目標以及效果,包括了......一起来看看 《網絡社會之崛起》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具