基于vue2.x的webpack4配置(生产环境~)

点我看看~
webpack(4)说复杂也不复杂。不复杂,核心概念不外乎是entry, output, loader, plugins。webpack4还新增了optimization选项,用于代码分割和打包优化。现在webpack官网文档已经写的挺棒了。

然鹅,当你真正开始手写一个webpack.config.js的时候,你就会发现,要记得东西有点儿多,还挺复杂的……

好啦,Ladies and Gentleman,本文讲的是手动编写基于vue开发的webpack4配置,以下内容主要针对生产环境,开发环境的配置于之后奉上。 created by 2018.07.22 。


webpack的核心概念包含以下几个,要牢记:

  • entry - webpack打包的入口,并非代码执行的入口;
  • output - webpack打包后生成的静态资源文件,它是最终会被html引用的文件;
  • loader - 对于非js的模块(或说文件),转化成webpack能够处理的js文件;对于还要进一步处理的js文件进行加工处理;
  • plugins - 参与到整个webpack打包的过程,可与loader结合使用,提供相应/辅助的功能。

Entry:
entry可以是单个入口,也可以是多入口。
单个入口的写法:

    entry: 'a.js' 或 ['a.js', 'b.js']

多个入口的写法:

    entry: {
      a: 'a.js',
      b: 'b.js'
    }

webpack会以你给的entry为入口,根据dependency graph,挨个打包,结合其他相应的设置,最终输出成页面要引用的静态资源文件。注意了,这里提到的“结合其他相应的设置”,很可能是不止一处的设置。😂😂😂

output
output里面的选项主要有(但远不止以下):

  • filename: '[name].[hash].bundle.js' // [name]和entry里面的name对应
  • path: path.resolve(__dirname, 'dist') // 指最终打包生成的目录
  • publicPath: 可以是'./dist/' 或 '/' 或 cdn地址 // 指访问静态资源文件的路径
  • chunkFilename: '[name].chunk.js' // 指用webpack.ensure或import().then()动态加载的文件

loader
loader就是把模块转换成webpack能够处理的js文件(如css,scss,vue等非js模块),或者对js模块本身进行再加工(如编译es6语法等)。
loader的写法好有好几种,loader一般放在module这个对象里的rules里面,现总结以下4种:

    module: {
        rules: [
            { //第一种, 需要用到的loader简单的放在use数组里
                test: /\.(sa|sc|c)ss$/,
                use: [
                  devMode ? 'style-loader' :    MiniCssExtractPlugin.loader,
                  'css-loader',
                  'postcss-loader',
                  'sass-loader',
                ],
            },
            {// 第二种,use里面是一个个对象,这种方式可以给loader进行配置
                test: /\.css$/,
                use: [
                    {
                        loader: 'postcss-loader',
                        options: {
                            ident: 'postcss',
                            plugins: [
                                require('autoprefixer')({
                                    browsers: ['iOS >= 7', 'Android >= 4.1']
                                }),
                            ]
                        }
                    }
                ]
            },
            {//第三种,单个loader和对象loader一起放在use数组里
                test: /\.(png|jpg|jpeg|gif)$/i
                use: [
                    'file-loader',
                    {
                        loader: 'image-webpack-loader',
                        optiosn: {
                            pngquant: {
                                quality: '65-80'
                            }
                        }
                    }
                ]
            },
            {//简单使用loader,不用use
                test: /\.vue$/,
                loader: 'vue-loader'
            }
        ]
    }

总结一下loader的常用四种写法:

use: [xxx, xxx]
use: [{loader: XXX}, {loader: XXX}]
use: [{
    loader: XXX,
    options: {}
}, 'XXX']
loader: [XXX, XXX]
loader的options配置项里面还可以放置loader,also plugins 😂😂😂

常用的loader有:

  • 处理样式的:style-loader,css-loader,postcss-loader,sass-loader,less-loder
  • 处理es6的:babel-loader(要连同babel-core, babel-preset-env)一起用
  • 处理图片的:file-loader, url-loader, image-webpack-loader

Plugins
常用的plugin有:

  • 压缩js:uglifyjs-webpack-plugin
  • 合并&压缩css: mini-css-extract-plugin,optimize-css-assets-webpack-plugin
  • 清除目录:clean-webpack-plugin
  • 生成html:html-webpack-plugin
  • postcss相关的:postcss-plugin-px2rem,postcss-preset-env,postcss-sprites,autoprefixer
  • webpack自带的方法:webpack.ProvidePlugin等

是不是开始觉得要记得东西很多啊?蛤蛤蛤蛤蛤蛤,不要急,要记得东西远不止这些……


以上讲的都是些概念和基本配置,结合起来怎么用呢?
先上目录:

目录.png

因为只写一个注册页,笔者没有用vue-cli,选择用webpack手动撸一个vue的配置。

因为是vue项目,这里多说两句。打包编译vue文件,需要用到vue-loader,样式需要用vue-style-loader,那么<template>怎么办呢?一定记住加载vue-template-compiler,虽然它只存在于你的node_modules文件夹中,但是vue-loader需要用到它,所以务必记住下载。

另外,在loader中设置了vue-loader之外,还得设置一个变量const { VueLoaderPlugin } = require('vue-loader'),并且在plugins里面创建一个它的实例才行,即new VueLoaderPlugin()。

ps. 系不系感觉复杂了?我也布吉岛为神马这些配置要分散在不同地方进行配置,这就加剧了webpack配置的复杂度。。。。

基本配置.jpeg

在我们书写配置的时候,一定要清楚自己想要webpack帮助你达到什么目的,以此来选择需要的loader和plugin以及其他辅助工具。

除了上面讲到的转化vue模块外,我需要webpack帮助我的主要是打包、压缩js,css,images,自动生成html文件,以及每次打包前先删除已存在的dist目录。所以上图中所引入的模块就是能完成这些功能的工具。


html.png

这个是对html文件进行打包压缩的,它会把html文件打包压缩成如下:


html压缩.png

css1.png
css2.png

上面两张图分别在loader和plugins里面用到,它们结合在一起可以把css样式文件打包成一个css静态资源文件,通过link标签引入进html文档中。


压缩1.png

在webpack4中,打包压缩JS和CSS都可以在optimization这个对象里进行。
它们分别会让你的js和css文件打包压缩成如下:


压缩结果1.jpeg
压缩结果2.png

另外webpack最显著的特点,这也是webpack创始人打造它的初衷,就是code splitting!既然如此,我们当然要发挥webpack这个特点,帮助我们优化啦!注意哦,code-split是内置在webpack里面的方法。在webpack4中,它在optimization里面配置,也就是取代了之前的commonsChunkPlugin这个插件。如下:


代码分割.png

另外,runtimeChunk用来单独打包压缩运行时的webpack代码。通俗的成为manifest.js


11.png

至此,经过npm run build之后,代码执行的入口文件为以下四个:


22.png

再让我们来分析一下打包后的文件大小,总之我打包后vendor变得很大,即便uglify了,也有188k。这可不行!这时候请记住plugin:compression-webpack-plugin。
然后如下图在plugins里面创建一个它的实例:


33.png

这样一来,打包后你生成的文件就会包含一个vendor.bundle.js.gz二进制格式的压缩文件。如下图:


44.png

很开熏是不是?但是我们打包后dist/index.html中引用的是vendor.bundle.js,并不是这个.gz的压缩文件,怎么办?
这时候就需要后端配合修改一下nginx的配置,增加gzip_static on。仅仅有gzip on是不行滴。

然后你再打开页面就会发现vendor.bundle.js变成了63.4k。虽然还没有达到我的要求,但是已经缩水一半以上了😁


55.png

补充说一下webpack4“动态引入”的不同,如果要用import().then()这个动态引入方法,需要安装babel-plugin-dynamic-import-webpack这个插件才行。

总结一下webpack如何复杂吧,总体来讲就是要记得东西很多,有点“无厘头,没规律”,具体来说至少包含以下几个方面:

  1. 有些功能用loader就完事了,可有些还要配合着plugins去写,没有统一的规律遵循,比较杂乱。有些loader本身要配置plugins,有些loader需要到外面大plugins对象里进行设置;
  2. 不同loader和plugins配置项可以很多,不同版本也不一样(希望以后版本更迭的成本小一些,给开发者多一些温油);
  3. 像babel这样的,要注意不同版本的差别,否则会报错。babel-loader, babel-core, babel-preset, babel-polyfill一定要对应着来。并且用了babel-loader并不久完事了,要去设置对应的presets告诉babel要把你的es6编译成啥样的规范,可以写在options里,也可以在根目录设置.babelrc。另外要编译es方法和函数还要用到polyfill,如果是开发框架则要用另一个babel-plugin--transform-runtime --save-dev和babel-runtime --save。

总之要记的很多就是了。。。
但是呢,如果能记住这些杂碎的东西,webpack能帮助你做到不少事!也就觉得没那么复杂了。当然啦,要弄懂原理是另一回事啦。😂😂😂

good night~

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

推荐阅读更多精彩内容