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变量
    },
<script src="main.js?6628f94fe86c206b417f"></script>
<!-- 尾部hash戳,防止因为浏览器缓存,导致文件不更新-->

开发静态服务器的配置

安装插件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属性添加浏览器前缀,
第一:需要插件autoprefixer@7.x版本,
第二:如果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')]
                }
            }]
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269