扶着你玩转webpack4——Code Splitting

Code Splitting

code splitting 特性是在 webpack3 中实现的,实现的策略方案也有多种,比如我们在 vue 项目中,通过组件按需引用也可以实现代码切割。主要目的:

  1. 为 Vendor 单独打包(Vendor 指第三方的库或者公共的基础组件,因为 Vendor 的变化比较少,单独打包利于缓存)
  2. 为 Manifest (Webpack 的 Runtime 代码)单独打包
  3. 为不同入口的公共业务代码打包(同理,也是为了缓存和加载速度)
  4. 为异步加载的代码打一个公共的包

webpack3 中,我们通常会有这样的配置:

new webpack.optimize.CommonsChunkPlugin({
  name: 'vendor',
  minChunks (module) {
    return (
      module.resource &&
      /\.js$/.test(module.resource) &&
      module.resource.indexOf(
        path.join(__dirname, '../node_modules')
      ) === 0
    )
  }
}),

new webpack.optimize.CommonsChunkPlugin({
  name: 'manifest',
  minChunks: Infinity
}),

new webpack.optimize.CommonsChunkPlugin({
  name: 'app',
  async: 'vendor-async',
  children: true,
  minChunks: 3
})

这里分别为第三方包,webpack运行时,业务代码分别配置了 CommonsChunkPlugin

那我们 code splitting 的目的在于实现 Long-term caching 。因为我们一般只会修改业务代码,而第三方通常不需要更新,所以分开打包就容易使第三方包的文件进入缓存策略,而业务代码因为文件内容的改变而改变了 hash 值,使得用户请求最新的文件。

webpack4 中移除了 CommonsChunkPlugin 。 具体详情可以看我的另一篇文章 webpack4: 代码分割CommonChunkPlugin的寿终正寝
然后需要使用 SplitChunksPlugin 来进行处理就ok啦~

entry: {
	app: './src/main.js',
	vendor: ['vue', 'axios']
},
optimization: {
  splitChunks: {
    name: 'bundle', // 打包之后的文件名,如果名称与入口点名称匹配,则将删除入口点。
    chunks: 'all' //'all'|'async'|'initial',分别代表了全部 chunk,按需加载的 chunk 以及初始加载的 chunk。 也可以是一个函数
  }
}

这种需要在入口进行指定,当然我们也可以直接把我们在项目中引用的来自 node_modules 的包全部打包成一个文件。

entry: {
	app: './src/main.js'
},
optimization: {
  splitChunks: {
    cacheGroups: {
      vendor: {
        test: /[\\/]node_modules[\\/]/,
        name: 'bundle',
        chunks: 'all'
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Webpack 实现 Code Splitting 的方式主要有以下几种: 1. 基于入口点(Entry Points)的 Code Splitting:通过将应用程序拆分为多个入口点,每个入口点都可以生成一个独立的代码块,从而实现 Code Splitting。可以使用 Webpack 的 `entry` 配置选项来指定多个入口点,例如: ```js module.exports = { entry: { app: './src/app.js', vendor: './src/vendor.js' }, // ... } ``` 在上面的例子中,`app` 和 `vendor` 分别是两个入口点,它们可以生成独立的代码块。 2. 基于模块(Module)的 Code Splitting:通过将应用程序中的模块拆分为多个代码块,从而实现 Code Splitting。可以使用 Webpack 的 `import()` 函数来实现基于模块的 Code Splitting,例如: ```js function loadComponent() { // 动态加载异步模块 return import('./components/MyComponent.vue') } // 使用异步组件 Vue.component('my-component', () => ({ // 异步加载组件 component: loadComponent(), // 加载组件时显示的占位符 loading: LoadingComponent, // 加载组件失败时显示的占位符 error: ErrorComponent, // 组件加载成功后的延迟时间 delay: 200, // 最长等待时间 timeout: 10000 })) ``` 在上面的例子中,`loadComponent()` 函数返回一个异步加载的模块,可以通过 `import()` 函数来加载模块。然后,在组件中使用异步组件来加载动态组件。 3. 基于运行时(Runtime)的 Code Splitting:通过将应用程序的代码分成多个块,并在运行时动态加载这些代码块,从而实现 Code Splitting。可以使用 Webpack 的 `require.ensure()` 函数来实现基于运行时的 Code Splitting,例如: ```js function loadComponent() { // 动态加载异步模块 require.ensure(['./components/MyComponent.vue'], function() { // 加载成功后的回调函数 const MyComponent = require('./components/MyComponent.vue') // 渲染组件 new Vue({ el: '#app', render: h => h(MyComponent) }) }, function() { // 加载失败后的回调函数 }, 'my-component') } ``` 在上面的例子中,`require.ensure()` 函数用于异步加载模块,并在加载成功后执行回调函数。第三个参数 `'my-component'` 表示这个代码块的名称,用于指定 Webpack 生成的代码块文件名。 需要注意的是,虽然这些方式都可以实现 Code Splitting,但它们的实现方式和使用场景有所不同。因此,在实际开发中,应该根据具体的需求来选择合适的方式来实现 Code Splitting
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值