webpack说复杂也不复杂。不复杂,核心概念不外乎是entry, output, loader, plugins。webpack4还新增了optimization选项,用于代码分割和打包优化。现在webpack官网文档已经写的挺棒了。而当你真正开始手写一个webpack.config.js的时候,你就会发现,要记得东西有点儿多,还挺复杂的……

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


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

  • entry - webpack打包的入口,并非代码执行的入口;
  • output - webpack打包后生成的静态资源文件,它是最终会被html引用的文件;
  • loader - 对于非js的模块(或说文件),转化成webpack能够处理的js文件;对于还要进一步处理的js文件进行加工处理;
  • plugins - 参与到整个webpack打包的过程(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种:

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

use: [xxx, xxx]use: [{loader: XXX}, {loader: XXX}]use: [{ loader: XXX, options: {}}, 'XXX']loader: [XXX, XXX] 或 loader:XXX, options: {XXX}

常用的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等

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


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

先上目录:

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

打包编译vue文件,需要用到vue-loader,样式需要用vue-style-loader,那么怎么办呢?一定记住安装vue-template-compiler,虽然它只存在于你的node_modules文件夹中,但是vue-loader需要用到它,所以务必记住安装。

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

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

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

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


这个是利用你的template文件生成最终的html文件,并对html文件进行打包压缩的,它会把html文件打包压缩成如下:

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

在webpack4中,打包压缩JS和CSS都可以在optimization这个对象里进行。如果不写minimize,则mode为production时webpack会自动开启uglifyjs的操作。倘若写了minimize,里面却不配置uglifyjs,则这个自动的操作会被取消。

它们分别会让你的js和css文件打包压缩成如下:

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

另外,runtimeChunk用来单独打包压缩运行时的webpack代码。

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

再让我们来分析一下打包后的文件大小,总之我打包后vendor变得很大,即便uglify了,也有188k。这可不行!这时候请记住plugin: compression-webpack-plugin

然后如下图在plugins里面创建一个它的实例:

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

很开熏是不是?但是我们打包后dist/index.html中引用的是vendor.bundle.js,并不是这个.gz的压缩文件,怎么办?

这时候就需要后端配合修改一下nginx的配置,增加gzip_static on。仅仅有gzip on是不行滴。

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

补充说一下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。

总之要记的很多就是了。。。


链接文章:

https://segmentfault.com/a/1190000015725670

uglifyjs报错 webpack_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置相关推荐

  1. vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...

    webpack说复杂也不复杂.不复杂,核心概念不外乎是entry, output, loader, plugins.webpack4还新增了optimization选项,用于代码分割和打包优化.现在w ...

  2. uglifyjs报错 webpack_用webpack的uglifyJS压缩ES6代码报错

    问 题 不能用webpack压缩ES6的代码吗?去掉ES6代码就正常了 出错的代码处,都是对象属性简写,箭头函数等ES6代码 module.exports = { mounted(){this.rea ...

  3. uglifyjs报错 webpack_webpack3里使用uglifyjs压缩js时打包报错的解决

    环境:webpac<4的下,安装uglifyjs.cnpm install uglifyjs-webpack-plugin -D 安装完毕后,去npm里查看uglifyjs的使用方法并添加到代码 ...

  4. uglifyjs报错 webpack_vue使用uglifyjs-webpack-plugin后打包报错

    楼主最新对已做项目进行打包优化,配置了打包环境下去除console.log语句插件---使用uglifyjs-webpack-plugin 具体代码如下 npm install uglifyjs-we ...

  5. uglifyjs报错 webpack_UglifyJs打包压缩问题引起的思考

    问题背景 最近做了一个webapp项目,qa用手机测试功能时,在iphone6plus上表现是白屏,其他手机目测是ok的:因为之前在测试其他项目时也发现在这个iphone6上表现与其他手机不太一样.于 ...

  6. uglifyjs报错 webpack_vue 解决uglifyjs-webpack-plugin打包出现报错的问题

    楼主最新对已做项目进行打包优化,配置了打包环境下去除console.log语句插件---使用uglifyjs-webpack-plugin 具体代码如下 npm install uglifyjs-we ...

  7. load方法引入本地html报错,分享基于plus.downloader的图片懒加载功能,支持本地缓存v1.1.0...

    今天试用了下hello mui上的图片懒加载功能,发现有些地方还无法满足我的需求,ajax动态加载的时候无法实现懒加载. 然后又看了下36kr的示例,因为代码关系实在太多了,耦合度比较高,遂自己动手写 ...

  8. Ubuntu安装软件时报错(报错:dpkg: 处理软件包 xxx (--configure)时出错: 依赖关系问题 - 仍未被配置)

    Ubuntu安装软件时报错 报错:dpkg: 处理软件包 ······ (–configure)时出错: 依赖关系问题 - 仍未被配置. 报错信息: done! update-alternatives ...

  9. npm报错`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`

    今天刚来公司启动项目就给我报下面的错误 百度一下,通常报这个错的原因是:webpack-dev-server 版本存在问题 解决办法:安装 webpack-dev-server 低版本号 方法一:删除 ...

最新文章

  1. linux网卡钩子,linux-Netfilter钩子注册与网络子系统
  2. C# WinForm中 让控件全屏显示的实现代码
  3. Allegro如何导出生产文件
  4. oracle让查出来的数据排序,Oracle数据库的查询排序
  5. 激活层是每一层都有吗_89小户型复式这样装,每一层都设计得很棒,完工后秒变小区样板间,邻居前来取经...
  6. Tomcat中的零停机部署(和回滚); 演练和清单
  7. Tableau数据分析:NC Retail Order Data(英)Data Science Program Lab#1(GTI)
  8. link标签引入.css文件(目的):适配不同屏幕
  9. 读取设置config.ini配置
  10. vue中的循环v-for
  11. kafka中的数据发送保障
  12. Python 的一些网络库(感谢Arbow)
  13. 小蚂蚁学习C语言(27)——C语言中的进制转换
  14. 现代语音信号处理之语音特征参数估计
  15. PR简单压缩视频、音频、调整音频声音大小
  16. ul阻燃标准有几个等级_塑料制品中的UL 阻燃等级防火等级划分标准
  17. Endurance International Group任命曼尼什达拉尔为亚太区董事总经理
  18. 智慧城市建设主要包括哪些方面
  19. 两个DIV并列排在一个大的DIV中
  20. 什么是ISTQB认证

热门文章

  1. 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数
  2. 线性代数之行列式矩阵术语中英对照
  3. 本地文件上传到ecs_将本地代码上传到GitHub
  4. Linux驱动编程 step-by-step (九)字符设备模拟pipe的驱动程序
  5. BM22 比较版本号
  6. 碰碰车司机教你Linux下使用nmon分析系统性能
  7. linux常用命令--diff
  8. windows自带的压缩,解压缩命令
  9. WIN2003下×××服务器架设攻略
  10. SVN Error:请求的名称有效并且在数据库中找到,但是它没有相关的正确的数据来被解析...