Webpack的Code Splitting实现按需加载

简介:
+关注继续查看

一. 什么是Code Splitting?

在最开始使用Webpack的时候, 都是将所有的js文件全部打包到一个build.js文件中(文件名取决与在webpack.config.js文件中output.filename), 但是在大型项目中, build.js可能过大, 导致页面加载时间过长. 这个时候就需要code splitting, code splitting就是将文件分割成块(chunk), 我们可以定义一些分割点(split point), 根据这些分割点对文件进行分块, 并实现按需加载.

二. Code Splitting的作用?

  1. 第三方类库单独打包:
    由于第三方类库的内容基本不会改变, 可以将其与业务代码分离出来, 这样就可以最大化的利用浏览器的缓存机制, 减少请求.
  2. 按需加载:
    Webpack支持定义分割点, 通过require.ensure进行按需加载.

三. 如何进行Code Splitting?

下面的代码是基于vue-cliwebpack-simple模板生成的演示文档

//cmd
vue init webpack-simple code_spliting_demo
复制代码

(一) 第三方类库单独打包

我们假设项目中引入了jquery.jsrespond.js, 那么我们可以在webpack.config.js中配置多入口来进行将这两个第三方类库单独打包.

  • webpack.config.js进行配置

    //webpack.config.js
    
    //在entry中添加相应第三方类库
    entry: {
        bundle: './src/main.js',
        vendor: ['./src/lib/jquery-1.10.2.min.js', './src/lib/respond.min.js']
    }
      
     //在plugins中添加CommonChunkPlugin
    plugins:[
        new webpack.optimize.CommonsChunkPlugin({ 
            name: 'vendor',  
            filename: 'vendor.bundle.js'  
        })
    ]
    复制代码
  • 执行npm run build, 此时dist目录下生成了两个文件, 分别是build.jsvendor.bundle.js

    npm run build后的生成文件
  • index.html中引入, 注意: vendor.bundle.js优先于build.js引入

    //index.html
    
    <script src="/dist/vendor.bundle.js"></script>
    <script src="/dist/build.js"></script>
    复制代码

(二) 按需加载

我们可以在router中进行配置, 实现组件的按需加载, 在一些单个组件文件较大的时候, 采用按需加载能够减少build.js的体积, 优化加载速度(如果组件的体积较小, 那么采用按需加载会增加额外的http请求, 反倒增加了加载时间)

  • 这里, 我们增加3个组件,分别是A.vue, B.vue, C.vue

    //A.vue
    <template>
        <h1>这里是A.vue组件</h1>
    </template>
    
    //B.vue
    <template>
        <h1>这里是B.vue组件</h1>
    </template>
    
    //C.vue
    <template>
        <h1>这里是C.vue组件</h1>
    </template>
    复制代码
  • 在路由中进行配置 (注意:这里是为了方便, 是在app.js中添加的路由, 在实际的项目中, 路由应该单独抽取出来)

    //app.js
    
    import Vue from 'vue'
    import App from './App.vue'
    import VueRouter from 'vue-router'
    Vue.use(VueRouter)
    
    //AMD规范的异步载入
    const ComA = resolve => require(['./components/A.vue' ], resolve);
    const ComB = resolve => require(['./components/B.vue' ], resolve);
    const ComC = resolve => require(['./components/C.vue' ], resolve);
    
    const router = new VueRouter({
      routes: [
        {
          name: 'component-A',
          path: '/a',
          component: ComA
        },
        {
          name: 'component-B',
          path: '/b',
          component: ComB
        },
        {
          name: 'component-C',
          path: '/c',
          component: ComC
        }
      ]
    })
    
    new Vue({
      el: '#app',
      router: router,
      render: h => h(App)
    })
    复制代码
  • webpack.config.js中进行配置output.chunkFilename,

//webpack.config.js

output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js',
    //添加chundkFilename
    chunkFilename: '[name].[chunkhash:5].chunk.js'
}
复制代码
  • 执行npm run build, 此时dist目录下生成了5个文件, 多出的3个文件,就是对应的A.vue, B.vue, C.vue这三个组件

    npm run build后生成的文件
CMD规范的异步载入

刚才在路由引入的时候, 使用的是AMD规范的异步载入. webpack提供了require.ensure()这个方法实现CMD规范的异步载入. 这同样也是webpack推荐的载入方式.想深入了解ensure, 请点击《webpack代码分离 ensure 看了还不懂,你打我》

  • 下面的代码是使用require.ensure()方法对路由进行配置
//app.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

//AMD风格的异步加载
// const ComA = resolve => require(['./components/A.vue' ], resolve);
// const ComB = resolve => require(['./components/B.vue' ], resolve);
// const ComC = resolve => require(['./components/C.vue' ], resolve);

//CMD风格的异步加载
const ComA = resolve => require.ensure([], () => resolve(require('./components/A.vue')));
const ComB = resolve => require.ensure([], () => resolve(require('./components/B.vue')));
const ComC = resolve => require.ensure([], () => resolve(require('./components/C.vue')));

const router = new VueRouter({
  routes: [
    {
      name: 'component-A',
      path: '/a',
      component: ComA
    },
    {
      name: 'component-B',
      path: '/b',
      component: ComB
    },
    {
      name: 'component-C',
      path: '/c',
      component: ComC
    }
  ]
})

new Vue({
  el: '#app',
  router: router,
  render: h => h(App)
})
复制代码
  • 执行npm run build后, dist目录下同样生成5个文件
    npm run build后生成的文件
    npm run build后生成的文件
  • 按需加载效果演示:
    按需加载效果演示
    按需加载效果演示
Lee_tanghui 发布在 https://www.jianshu.com/p/b3b8fb8a2336



原文发布时间为:2018年06月26日
原文作者:zhaiyy
本文来源掘金如需转载请联系原作者

相关文章
|
1月前
webpack与grunt、gulp的不同?
webpack与grunt、gulp的不同?
|
1月前
|
JavaScript 前端开发 中间件
实现一个 webpack loader 和 webpack plugin
实现一个 webpack loader 和 webpack plugin
27 0
|
1月前
|
缓存 前端开发 API
如何实现一个Webpack Loader
如何实现一个Webpack Loader
31 0
|
2月前
|
前端开发 开发者
Webpack和Vite的区别
Webpack 是一个非常强大的构建工具,但是随着项目规模的增大,Webpack 的构建速度会变得越来越慢,因为它需要将所有模块打包到一个文件中,每次修改都需要重新构建整个项目。而 Vite 采用的是基于浏览器原生 ES 模块的特性,即只会对修改的模块进行重新构建,因此在大型项目中,Vite 的构建速度要比 Webpack 快得多。
|
5月前
|
前端开发 JavaScript Shell
webpack 执行流程 —— 实现 myWebpack
webpack 执行流程 —— 实现 myWebpack
63 0
|
5月前
webpack打包优化之moment语言包优化moment-locales-webpack-plugin
webpack打包优化之moment语言包优化moment-locales-webpack-plugin
77 0
|
7月前
webpack中library和libraryTarget
webpack中library和libraryTarget
55 0
|
7月前
|
JavaScript 算法 内存技术
webpack优化篇(四十二): 使用高版本的 webpack 和 Node.js
webpack优化篇(四十二): 使用高版本的 webpack 和 Node.js
73 0
webpack优化篇(四十二): 使用高版本的 webpack 和 Node.js
webpack 4.x 基本配置以及通过webpack-hot-middleware 实现自动刷新
开始入手webpack ,直接看的官方文档和demo,对于自动刷新这部分还是希望通过express 加载插件来控制,但是文档没有提供,经过参考github上其他高玩的套路,最终整理了一个基础的配置版本。
webpack 4.x 基本配置以及通过webpack-hot-middleware 实现自动刷新
相关产品
云迁移中心
推荐文章
更多