小生愛

    

    
        const webpack = require('webpack')
        const path = require('path')

        module.exports = {
          // context: 如果不通过path.resolve 配置入口访问路径 watch: true失效
          context: path.resolve('./app1'),

          entry: {
            index: './index',
            name: './name',
            mobile: './mobile',
            public: ['jquery', 'vue']
          },

          output: {
            // filename: 编译的文件名 仅用于命名每个文件
            // [name]: 多入口形式 入口文件名替换这里的name 
            // [chunkhash]: 入口文件的hash值 用于修改后清空缓存
            filename: '[name].[chunkhash:8].js',
            // 包存放的目录
            path: path.resolve('./lx')
          },

          module: {
            rules: [
              {
                // 匹配一个正则表达式
                test: /\.css$/,
                use: [
                  {loader: 'style-loader!css-loader'},
                ]
              }
            ]
          },

          plugins: [

            /*
              CommonsChunkPlugin 插件 

                是一个可选的用于建立一个独立文件(又称作 chunk)的功能
                这个文件包括多个入口 chunk 的公共模块 通过将公共模块拆出来 最终合成的文件能够在
                最开始的时候加载一次 便存起来到缓存中供后续使用 这个带来速度上的提升 因为浏览器会
                迅速将公共的代码从缓存中取出来 而不是每次访问一个新页面时 再去加载一个更大的文件
            */


            /**
              * 方式 1. 只有一个公共文件 
            */

            /*
              // 提取 entry 公共代码
              // 比如index.js 引用了 sub.js
              // mobile.js 也引用了 sub.js
              // 这时CommonsChunkPlugin 会把它们"引用"的公共代码提取出来
              // 公共代码的名字可以随便取 如 commons
              new webpack.optimize.CommonsChunkPlugin({
                // 公共模块名称只有一个
                name: 'commons',
                // 通过 chunk name 去选择 chunks 的来源 chunk 必须是公共chunk 的子模块
                // 如果被忽略 所有的入口chunk (entry chunk) 都会被选择
                // 添加name 可以防止没改动第三方包 而改动其他文件 刷新第三方包的hash 导致页面要重新加载第三方包
                // 打包index.js name.js里的公共文件
                chunks: ['index', 'name']
              })
            */


            /**
              * 方式 2. 公共业务模块与类库或框架分开打包
              
              * 个人认为最好的打包方式: 
                  第三方类库一起打包 单独打包 可以缓存起来
                  其他业务模块单独打包抽取公共的JS 减少代码量
            */
            
            new webpack.optimize.CommonsChunkPlugin({
              // 公共模块名称 有多个 使用数组
              // 匹配entry 入口文件名 相同的单独打包 其他模块统一抽取公共代码到commons.js中
              // 公共文件必须放在这里打包 否则公共文件会在每个文件里都有
              names: ['commons', 'public']
              // 包含几个公共模块 才合并
              // minChunks: 'Infinity',
              // 通过 chunk name 去选择 chunks 的来源 chunk 必须是公共chunk 的子模块
              // 如果被忽略 所有的入口chunk (entry chunk) 都会被选择
              // 添加name 可以防止没改动第三方包 而改动其他文件 刷新第三方包的hash 导致页面要重新加载第三方包
              // 打包index.js name.js里的公共文件
              // 这里可以不写chunks 则打包所有entry中的文件
              // * 这里建议不要写chunks 如果要写把entry入口的文件都写里面 否则第三方插件会重复插入 (不知道喂猫)
              // chunks: ['index', 'name', 'public']
            })
          ],

          watch: true
        }