浅谈Webpack 持久化缓存实践(3)

  • 在多页面应用中,我们往往可以将公共模块进行抽离,比如 header, footer 等等,这样页面在进行跳转的时候这些公共模块因为存在于缓存里,就可以直接进行加载了,而不是再进行网络请求了。
  • 那么如何进行拆包,分模块进行加载,这就需要 webpack 内置插件:CommonsChunkPlugin,下面我将通过一个例子,来诠释 webpack 该如何进行配置。

    本文的代码放在我的 Github 上,有兴趣的可以下载来看看:

    git clone https://github.com/happylindz/blog.git
    cd blog/code/multiple-page-webpack-demo
    npm install
    

    阅读下面的内容之前我强烈建议你看下我之前的文章:深入理解 webpack 文件打包机制,理解 webpack 文件的打包的机制有助于你更好地实现持久化缓存。

    例子大概是这样描述的:它由两个页面组成 pageA 和 pageB

    // src/pageA.js
    import componentA from './common/componentA';
    // 使用到 jquery 第三方库,需要抽离,避免业务打包文件过大
    import $ from 'jquery';
    // 加载 css 文件,一部分为公共样式,一部分为独有样式,需要抽离
    import './css/common.css'
    import './css/pageA.css';
    console.log(componentA);
    console.log($.trim(' do something '));
    
    // src/pageB.js
    // 页面 A 和 B 都用到了公共模块 componentA,需要抽离,避免重复加载
    import componentA from './common/componentA';
    import componentB from './common/componentB';
    import './css/common.css'
    import './css/pageB.css';
    console.log(componentA);
    console.log(componentB);
    // 用到异步加载模块 asyncComponent,需要抽离,加载首屏速度
    document.getElementById('xxxxx').addEventListener('click', () => {
     import( /* webpackChunkName: "async" */
     './common/asyncComponent.js').then((async) => {
      async();
     })
    })
    // 公共模块基本长这样
    export default "component X";

    上面的页面内容基本简单涉及到了我们拆分模块的三种模式:拆分公共库,按需加载和拆分公共模块。那么接下来要来配置 webpack:

    const path = require('path');
    
    const webpack = require('webpack');
    
    const ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    module.exports = {
    
     entry: {
    
     pageA: [path.resolve(__dirname, './src/pageA.js')],
    
     pageB: path.resolve(__dirname, './src/pageB.js'),
    
     },
    
     output: {
    
     path: path.resolve(__dirname, './dist'),
    
     filename: 'js/[name].[chunkhash:8].js',
    
     chunkFilename: 'js/[name].[chunkhash:8].js'
    
     },
    
     module: {
    
     rules: [
    
      {
    
      // 用正则去匹配要用该 loader 转换的 CSS 文件
    
      test: /.css$/,
    
      use: ExtractTextPlugin.extract({
    
       fallback: "style-loader",
    
       use: ["css-loader"]
    
      }) 
    
      }
    
     ]
    
     },
    
     plugins: [
    
     new webpack.optimize.CommonsChunkPlugin({
    
      name: 'common',
    
      minChunks: 2,
    
     }),
    
     new webpack.optimize.CommonsChunkPlugin({
    
      name: 'vendor',
    
      minChunks: ({ resource }) => (
    
      resource && resource.indexOf('node_modules') >= 0 && resource.match(/.js$/)
    
      )
     }),
     new ExtractTextPlugin({
      filename: `css/[name].[chunkhash:8].css`,
     }),
     ]
    }
          

    内容版权声明:除非注明,否则皆为本站原创文章。

    转载注明出处:http://www.heiqu.com/503.html