webpack配置详情

webpack安装

yarn add webpack webpack-cli -S

mode属性,指明打包环境

mode:'development', //打包模式 默认两种 production和development

开发环境下,打包输出的文件不会进行压缩;生产环境则会

入口entry和出口output

// entry:{    //配置多入口文件
    //     home:'./src/home.js',
    //     other:'./src/other.js'
    // }, 
    entry:'./src/index.js',
    output:{    
        filename:'[name].[hash:8].js',
        //打包后的文件名,[hash],打包后会在文件后缀添加hash戳,长度为8个字节
        path:path.resolve(__dirname,'dist'),
        //路径必须是一个绝对路径,可以使用path模块转换成绝对路径
        // publicPath:''//打包后统一添加前缀域名
        library:'bd',//将打包的文件执行的即使函数赋值给bd变量
    },


开发静态服务器的配置

安装插件webpack-dev-server,安装后静态服务配置需要在devServer中配置

module.exports={
    devServer:{ //开发静态服务配置
        port:3000,
        progress:true,
        hot:true, //热更新
        contentBase:"./dist",
        compress:true, //gzip压缩
        before(webapp){ //只想单纯模拟数据数据时 ,可以再before钩子函数中写假数据
            webapp.get('/api/user',(req,res)=>{
                res.json({'name':'xxxxxxxxxx'})
            })
        },
        // proxy:{ //请求代理到express服务器,解决跨域的问题,本地服务端口必须是8080,需要开发模式下使用
        //     '/api':{
        //         target:'http://localhost:3002',
        //         pathRewrite:{'/api':'/get'} //重写url地址,请求服务器提供的url地址
        //     }
        // }
    },
  • 在package.json文件中配置执行脚本命令
 "scripts": {
    "build": "webpack --config webpack.config.js",
    "dev": "webpack-dev-server"
  },
  • 打包指令
    yarn run build 是webpack打包指令,如果安装了webpack-cli,可以使用npx webpack进行打包;--config webpack.config.js参数指明了webpack的配置文件,你的webpack配置文件名也可以是webpack.dev.js或者 webpack.prod.js,通过--config xxx.js指明目标webpack配置进行打包

  • 开启静态服务指令
    yarn run dev

常用插件

//将所有js文佳中引入的样式文件打包合并到一个文件
let MiniCssExtractPlugin = require('mini-css-extract-plugin')
//css压缩
let OptimizeCss = require('optimize-css-assets-webpack-plugin')
//mini-css-extract-plugin压缩css,不过该压缩会覆盖webpack提供的默认设置,
//因此还需要插件uglifyjs-webpack-plugin压缩js,需要在生产模式下起作用
let UglifyJsWebpackPlugin = require('uglifyjs-webpack-plugin')
//打包时清除旧的打包文件
let {CleanWebpackPlugin} = require('clean-webpack-plugin')
//拷贝其他文件夹下的文件到打包目录
let CopyWebpackPlugin = require('copy-webpack-plugin')
//使用webpack本身的插件时
let Webpack = require('webpack')

plugins插件配置

plugins:[ //数组 ,放着所有的webpack插件,插件十个类或者构造函数
        new HtmlwebpackPlugin({
            'template':'./src/index.html',//目标模板文件
            'filename':'index.html',
            'minify':{
                // removeAttributeQuotes:true,//删除html可以去除掉的双引号
                // collapseWhitespace:true//折叠一行显示
            },
            hash:true //每次打包生成不同的文件名解决由于缓存,文件不变的问题
        }),
        new MiniCssExtractPlugin({
            filename:"main.css" //规定抽离出的css文件名
        }),
        new Webpack.ProvidePlugin({
            $:'jquery' // 使用webpack插件中的ProvidePlugin方法,将jquery以$注入到模块中
        }),
        new Webpack.DefinePlugin({ //定义全局变量,将下方属性注入到所有模块中
            "DEV":JSON.stringify('production')
        }),
        new CleanWebpackPlugin(), //重新打包删除旧的打包输出的目录dist
        // new CopyWebpackPlugin({//将目标文件夹下的文件拷贝到dist打包目录
        //     patterns:[{
        //         from:'fromDir',to:''
        //     }]
        // }),
        new Webpack.NamedModulesPlugin(), //打印更新的模块路径
        new Webpack.HotModuleReplacementPlugin() //热更新组件

    ],

webpack优化项

  optimization:{ //webpack 优化项  需要在production模式下起作用
        minimizer:[
            new OptimizeCss(),
            new UglifyJsWebpackPlugin({
                cache:true,
                parallel:true,
                sourceMap:true
            })
        ],
        splitChunks:{ //分割代码块,将公共部分代码抽离成一个文件
            cacheGroups:{
                common:{
                    chunks:'initial',
                    minSize:0,
                    minChunks:2 //引用大于等于2次才进行抽离
                },
                vendor:{ //抽离出公共的模块,依赖苦苦
                    priority:1,//优先抽离 
                    test:/node_modules/,
                    chunks:'initial',
                    minSize:0,
                    minChunks:2
                }
            }
        }
    }

resolve 属性

resolve:{ //用来解析第三方包
        modules:[path.resolve('node_modules')],
      // 配置 Webpack 去哪些目录下寻找第三方模块
        extensions: ['.js', 'css','.json'],
       //在导入语句没带文件后缀时,Webpack 会自动带上后缀后去尝试访问文件是否存在
        alias:{ //配置项通过别名来把原导入路径映射成一个新的导入路径。
            bootstrap:'bootstrap/dist/css/bootstrap.css'
        },
        mainFields:['style','main']
      //有一些第三方模块会针对不同环境提供几分代码,对应代码标识在package.json文件
      //Webpack 会根据mainFields的配置去决定优先采用那份代码
    },

loader加载器

module:{
        //loader
        rules:[//规则
            {
                test:/\.(png|jpg|gif)/,
                use:{
                    //loader:'file-loader',//在js中引入图片 file-loader 默认会在出口文件内部生成一张图片,并返回的结果是一个新的图片地址
                    loader:'url-loader', //url-loader 会把图片地址转为base64,不会发起网络请求资源
                    options:{
                        limit:100,//规定小于100byte字节转为base64
                        outputPath:'img/',//设置打包后突变的保存路径
                        publicPath:''//打包后统一添加前缀域名,可用于CDN
                    }
                }
            },
        {
            test:/\.js$/,
            use:{
                loader:'babel-loader',
                options:{
                    presets:['@babel/preset-env']
                 }
            },
            include:path.resolve(__dirname,'src'),
            exclude:/node_modules/
            
        },
            //style-loader 它时把css插入到head的标签中的
            //loader 特点:希望单一
            //多个loader需要使用[]
            //loader的顺序,是从右向左,从下至上执行
            //loader还可以携程对象的形式
        {
            test:/\.css$/,use:[
            MiniCssExtractPlugin.loader,//不使用style-loader的插入css样式,使用link标签引入的方式
            'css-loader','postcss-loader']
        },
        {
            test:/\.less$/,use:[
            MiniCssExtractPlugin.loader,
            'css-loader','postcss-loader','less-loader']
        },
        {
            test:/\.scss$/,use:[
            MiniCssExtractPlugin.loader,
            'css-loader','postcss-loader','sass-loader']
        },
    ]
    },

externals属性

 externals:{ //该属性规定发布时,不对以下库进行打包到bundle.js中,
        //发布时有些库在html使用了cdn的方式引入库,所以不需要再将依赖代码进行打包
        jquery:'$'
    }

watch实时监控打包

 watch:true, //打开实时监控内容改变
 watchOptions:{ //监控选项
      poll:500,//一秒轮询500次
      aggregateTimeout:500, // 防抖 内容修改结束保存后500毫秒后开始打包
      ignored:/node_modules/ //不需要进行监控的文件
    }

webpack优化点

  • 打包代码压缩
  • noParse,不去解析依赖库
  • 使用exclude和include去限制加载编译的文件
  • webpack.IgnorePlugin
  • happypack 多线程打包
  • import
  //es6 草案中的语法。webpack中实现懒加载,jsonp原理实现动态加载文件
  import('./lazyloading.js').then((data)=>{
      console.warn(data)
  })

热更新 devServer中配置hot:true,搭配webpack插件

  • new webpack.NameModulesPlugin() 打印更新的模块路径
  • new webpack.HotModuleReplacementPlugin() 热更新插件
  //热更新,不用刷新浏览器,指定文件内容发生改变会触发
     if(module.hot){
         module.hot.accept('./lazyloading',()=>{
             console.log('文件更新了!')
         })
     }

多个webpack文件公共部分合并

webpack-merge用来将一个webpack配置分成两个配置文件,一个开发环境一个生成环境
yarn add webpack-merge -D
三个配置文件:基础配置:webpack.base.js;开发环境配置:webpack.dev.js;生产环境配置:webpack.prod.js

    //在开发和生成配置文件中:
    let {smart} = require('webpack-merge')
    let  base = require('./webpack.base')
    module.exports = smart(base,{
        mode:'development',
        ...
        ...
   })

postcss-loader注意

使用postcss-loader给css属性添加浏览器前缀,
第一:需要插件[email protected]版本,
第二:如果autoprefixer是最新的,则需要在package.json中配置browserslist属性(这个属性配置能够分享目标浏览器和nodejs版本在不同的前端工具。这些工具能根据目标浏览器自动来进行配置,)
package.json中配置browserslist属性

"browserslist": [
    "> 1%",
    "last 4 version",
    "not ie <=8"
  ]

在postcss.config.js配置

module.exports = {
   plugins:[require('autoprefixer')]
  }

或者在webpack,postcss-loader的option配置

{
            test:/\.css$/,use:[
            'style-loader',
            'css-loader',{
                loader:'postcss-loader',
                options:{
                    plugins:[require('autoprefixer')]
                }
            }]
        }

你可能感兴趣的:(webpack配置详情)