Webpack模块打包技术

245 阅读2分钟

未拆分版本webpack.config.js

const path = require('path');//引入node的path模块
const webpack = require('webpack');//引入的webpack,使用Lodash
const HtmlWebpackPlugin  = require('html-webpack-plugin') //将html打包
const ExtractTextPlugin = require('extract-text-webpack-plugin') //打包的css拆分,将一部分
const CopyWebpackPlugin = require('copy-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
//console.log(path.resolve(__dirname,'dist'));//物理地址拼接
module.exports = {
    entry:'./src/index.js',//入口文件
    output:{
        path:path.resolve(__dirname,'dist'),//定位。输出文件的目标路径
        filename:'[name].js',
        chunkFilename: '[name].[hash:8].js' // 指定分离出来的代码文件的名称
    },
    optimization: {
        splitChunks: {
          chunks: "all", // 所有的 chunks 代码公共的部分分离出来成为一个单独的文件
        },
        minimizer: [new UglifyJsPlugin()],//压缩js
      },
    module:{
        rules:[
           {
               test:/\.js$/,//es6 => es5
               include:[path.resolve(__dirname,'src')],
               // exclude:[],不匹配选项(优先级高于test和include)
               use:'babel-loader'

           },{
               test:/\.less/,
               use:ExtractTextPlugin.extract({
                 fallback:'style-loader',
                 use:[
                     {
                         loader:'css-loader', 
                         options:{
                                minimize:true, //使用css的压缩功能   
                         }
                    },
                    {
                         loader:'less-loader',
                         options:{
                               minimize:true, //使用css的压缩功能   
                         }
                    },
                    
                 ]

               })

           },
           //这里需要图片精灵优化,但由于webpack4不支持
        /*   {    //图片loader
               test:/\.(png|jpg|gif)$/,
               use:[
                 {
                     loader:'file-loader' //根据文件地址加载文件
                 }

               ]
           }*/
           {
            test: /.*\.(gif|png|jpe?g|svg|webp)$/i,
            use: [
              {
                loader: 'file-loader',
                options: {}
              },
              {
                loader: 'image-webpack-loader',
                options: {
                  mozjpeg: { // 压缩 jpeg 的配置
                    progressive: true,
                    quality: 65
                  },
                  optipng: { // 使用 imagemin-optipng 压缩 png,enable: false 为关闭
                    enabled: false,
                  },
                  pngquant: { // 使用 imagemin-pngquant 压缩 png
                    quality: '65-90',
                    speed: 4
                  },
                  gifsicle: { // 压缩 gif 的配置
                    interlaced: false,
                  },
                  webp: { // 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式
                    quality: 75
                  },
              }
            }, {
                loader:'url-loader',
                options:{
                   limit:8192.//单位是Byte,当文件小于8kb时作为DataURL处理
                }
             }
            ]
        },
        
    ]
         
    },
    resolve:{  //解析模块的可选项
         // modules:[] //模块的查找目录 配置其他的css等文件
         //extensions:[".js",".json",".jsx",".less",".css"],//用到文件的扩展名
         extensions:[".js"],
         alias:{  //模块别名列表
            utils:path.resolve(__dirname,'src/utils')
         }
    },
    plugins:[
        new HtmlWebpackPlugin({
            filename:'index.html',// 配置输出文件名和路径
            template:'assets/index.html', // 配置文件模板
            minify:{   //压缩HTML的配置
                 minifyCSS:true,// 压缩HTML中出现的CSS代码
                 minifyJS:true //压缩HTML中出现的JS代码
             }
        }),
        new CopyWebpackPlugin([ //src下其他的文件直接复制到dist目录下
            {
                from:'src/assets/favicon.ico',
                to:'favicon.ico'
            }
        ]),
        new webpack.ProvidePlugin({ //引用框架jquery lodash工具库是很多组件会复用的,省去了import
            '_':'lodash' //引用webpack
        }),
        new webpack.NamedModulesPlugin(), // 用于启动 HMR 时可以显示模块的相对路径
        new webpack.HotModuleReplacementPlugin(), // Hot Module Replacement 的插件
    ],
    devServer: {
    
        port: 8080, // 端口号
        host: 'localhost',
        https: false, // https:{type:Boolean}
        open: true, // 配置自动启动浏览器
        hot:true,
        // proxy: 'http://192.168.9.120:8081',
        // proxy: 'http://47.106.65.135:7100' // 配置跨域处理,只有一个代理
        // proxy: 'http://14.29.227.88:8082' // 配置跨域处理,只有一个代理
        proxy: 'http://192.168.52.175:8087' // 配置跨域处理,只有一个代理
        // proxy: {
        //   '/api': {
        //     target: '<url>',
        //     ws: true,
        //     changeOrigin: true
        //   },
        //   '/foo': {
        //     target: '<other_url>'
        //   }
        // } // 配置多个代理
      }


}
/*"scripts":{
    "build":"webpack -- mode production",
    "start":"webpack-dev-server --mode development"
 }*/
 /*
 在 .babelrc 配置中增加 "modules": false 这个配置:
{
  "presets": [["env", { "modules": false }]]
}
通过给 package.json 加入 sideEffects: false
*/ 

拆分后 webpack.conig.js

module.exports = function(env, argv) {
  return argv.mode === 'production' ?
    require('./configs/webpack.production') :
    require('./configs/webpack.development')
}

webpack.development.js webpack.production.js webpack.base.js

const merge = require('webpack-merge')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const baseConfig = require('./webpack.base')

const config = merge.smart(baseConfig, {...})