webpack进阶(二)
1)webpack动态打包所有依赖项,避免打包未使用的模块。
2)转换css的loader有:css-loader,style-loader,加载图片或文件的loader是:file-loader,如果要压缩和优化图像,使用image-webpack-loader和url-loader。
3)加载字体,file-loader也可以进行字体资源的处理,可以用于任何类型的文件:woff,woff2,eot,ttf,otf等,使用font-face进行字体的设置。
4)加载XML,CSV数据等,需要使用csv-loader,xml-loader。JSON支持是内置的,这个类似于NodeJS。
5)HtmlWebpackPlugin默认生成index.html文件,替换原来在dist文件下的index.html。


可以看出HtmlWebpackPlugin创建了一个全新的文件,所有的bundle会自动添加到html中。
6)webpack打包后的代码/dist文件夹下,但是webpack无法追踪哪些文件是实际项目中用到,需要在构建前清理/dist文件夹,clean-webpack-plugin是个管理插件,可以用来清理打包后文件夹中的旧文件。
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
entry:{
app:'./src/index.js',
print:'./src/print.js'
},
mode:'production',
output:{
filename:'[name].bundle.js',
path:path.resolve(__dirname,'dist')
},
plugins:[
new HtmlWebpackPlugin({
title:'Output Management'
}),
new CleanWebpackPlugin(['dist']),
]
}
重新npm run start后,可以看出以前的bundle.js等不用的文件重新被清理,然后新的依赖打包后文件输出。
7)使用source map,通常浏览器里面运行的文件时打包编译后的bundle.js文件,如果源文件有错误,那么堆栈智慧简单指向bundle.js,没多大帮助,JavaScript提供了source map功能,将编译后的代码映射回源码。source map不是什么plugin或者loader,仅仅就是javascript的功能。这对于实际开发过程中非常有帮助。
sourceMap不仅支持调试javascript,对于css的调试,只需要在css的相关loader中打开devtool的sourMap开关即可。
8)"watch":"webpack --watch",npm run watch可以进行script脚本的观察,但是需要刷新浏览器。要实现自动刷新浏览器,则需要使用webpack-dev-server,它提供了一个简单的web服务器,并且能够实现实时重新加载,需要install webpack-dev-server。
9)webpack-dev-middleware,是一个容器,webpack-dev-server在内部使用了它,作为单独的包使用时,例如配合express中间件的使用,把webpack处理后的文件传递给一个服务器。
10)模块热更新(Hot Module Replacement),HRM,运行更新而无需完全刷新,适用于开发环境。HRM是webpack内置的插件,使用的时候在plugins里面,webpack.HotModuleReplacementPlugin()。webpack.namedModulesPlugin是为了更容易查看要修补的依赖,
【bug警示!!!】实际练习中,使用了module.hot条件,进行module.hot.accept方法的执行,发现视图并未热更新,后检查CLI的执行方法,发现使用的是npm run server。

而HRM是webpack-dev-server的hot参数设置为true,所以应该使用npm run start进行热更新运行。
11)tree shaking,用于移除JavaScript上下文中没有引用的代码。在package.json文件中添加sideEffects入口。
tree shaking:应用程序想象成一颗树,绿色代表实际用到的源码和库,是有活力的树叶,灰色代表无用代码,是枯萎的树叶,为了除去死去的树叶,必须摇动这颗树,使得它们落下。
【这也算是优化输出的一种解决方案】
12)webpack4通过配置mode模式为production,可以直接压缩输出。
13)目前webpack4因为零配置思想,需要你手动去安装uglify-webpack-plugin。webpack4.XX新增的mode默认是production,本身继承了UglifyPlugin,所以不需要再引入,开发环境则不需要压缩编译浪费时间,提高开发效率。
在script中的build执行命令中,加上“webpack --mode production”会自动压缩打包。
UglifyJS 是一个js 解释器、最小化器、压缩器、美化器工具集(parser, minifier, compressor or beautifier toolkit)。
注意:
uglify-js@3的API 和 CLI已简化,不再向后兼容uglify-js@2.UglifyJS
2.x文档在这里.uglify-js只支持 ECMAScript 5 (ES5).假如希望压缩 ES2015+ (ES6+)代码,应该使用 uglify-es这个
npm包。
14)开发环境VS生产环境
因为构建目标的差异,开发环境,关注点在:实时重载的热更新模块,source-map和localhost server本地服务器的构建,生产环境关注点:更小的bundle,更轻量级的source-map【一般生产的sourceMap也不会放在服务器】,更优化的资源,更少的加载时间。
所以生产环境配置和开发环境配置一般都是分开写。但是保留了通用配置,使用webpack-merge工具进行合并配置。
webpack.base.js或者webpack.common.js(通用配置),一般设置entry和output,一些公用插件的引入等,webpack.dev.js会添加devtool还有devServer等,而webpack.prod.js则会引入tree shaking删除不必要的模块,以及当mode是production时会自动引用UglifyJS进行压缩打包。
需要在package.json中进行设置start的CLI为"webpack-dev-server --open --config webpack.dev.js";而build中“webpack --config webpack.prod.js --mode production”。
15)官网鼓励在生产使用source map,但是会加大资源包,真正放在服务器的包还是要剥离该source map文件的。开发中的devtool:'inline-source-map'。可以在开发者模式查看源码。
16)process.env.NODE_ENV环境变量,有两个值,'production'和'development',是Node.js暴露给执行脚本的系统环境变量,任何在/src下面的本地代码都可以关联该环境变量。
if (process.env.NODE_ENV !== 'production') {
console.log('development ENV');
}else{
console.log('production ENV')
}
此代码在index.js文件中是执行成功的!!!
17)CSS分离,webpack的理念是将所有的东西都打包在js文件中,包括CSS,图片等,目的很明确就是为了减少http请求,但是劣势明显,随着项目越来越大,js文件也会愈来愈大,所以需要针对css进行分离,进行单独打包。可以使用ExtractTextPlugin将css分离成单独的文件。【css分离也算是webpack的高阶了】
【高级教程提示】Manifest对模块映射到输出bundle的过程保持追踪,manifest的概念以及WebpackManifestPlugin,缓存,代码分离等,是webpack的高阶教程了。
【完】
Today I get through with nothing done is just the tomorrow the men who dead yesterday eager for.
我荒废的今日,正是昨日殒身之人祈求的明日。 ——哈佛校训
webpack进阶(二)的更多相关文章
- webpack进阶构建项目(一)
webpack进阶构建项目(一) 阅读目录 1.理解webpack加载器 2.html-webpack-plugin学习 3.压缩js与css 4.理解less-loader加载器的使用 5.理解ba ...
- mysql进阶(二十九)常用函数
mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...
- mysql进阶(二十八)MySQL GRANT REVOKE用法
mysql进阶(二十八)MySQL GRANT REVOKE用法 MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...
- mysql进阶(二十七)数据库索引原理
mysql进阶(二十七)数据库索引原理 前言 本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. ...
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- J2EE进阶(二)从零开始之Struts2
J2EE进阶(二)从零开始之Struts2 以前自己总是听说什么SSH框架,不明觉厉.现在自己要重整旗鼓,开始系统性的学习SSH框架了.首先开始Struts2的学习.其实自己之前参与过Struts2项 ...
- Android进阶(二十八)上下文菜单ContextMenu使用案例
上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...
- 分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)
当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- Android进阶(二十)AndroidAPP开发问题汇总(四)
· Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...
随机推荐
- windows安装fdfs_client-py-master.zip 出现 error: Microsoft Visual C++ 14.0 is required.
背景:学习django+fdfs+nginx时碰见的问题,笔记本电脑的虚拟机ubuntu实在卡到怀疑人生,所以django装在windows,ubuntu只开启fdfs+nginx服务.于是就有在wi ...
- webservice入门程序学习中经验总结
***第一步:创建客户端服务 1)创建一个服务接口 2)创建一个实现类实现接口 3)创建一个方法开启服务 这三步注意点:::实现类上必须添加@WebService标签 :::发布服务的时候用到的函数是 ...
- java170道面试题汇总+详细解析
2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...
- LeetCode Day 11
LeetCode0021 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...
- C# Dictionary字典类介绍
说明 必须包含名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而值不需要唯 ...
- CSS性能优化探讨
大部分前端开发人员都不关心CSS性能优化,其实对于一个复杂的页面来说,高效的选择器还是可以带来一定的性能提升的. 1. CSS 选择器 浏览器是“从右往左”来分析 class 的,它的匹配规则是从右向 ...
- SHELL用法二(练习)
1.SHELL编程作业&剖析演练 1)SHELL编程Nginx虚拟主机脚本: 安装Nginx WEB平台: 配置虚拟主机(1个网站): 重启&加载配置文件: 配置hos ...
- RxJava操作符实践:8_算术和聚合操作之3_min
发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...
- 吴裕雄--天生自然python编程:实例
# 该实例输出 Hello World! print('Hello World!') # 用户输入数字 num1 = input('输入第一个数字:') num2 = input('输入第二个数字:' ...
- 吴裕雄--天生自然 R语言开发学习:高级编程
运行的条件是一元逻辑向量(TRUE或FALSE)并且不能有缺失(NA).else部分是可选的.如果 仅有一个语句,花括号也是可以省略的. 下面的代码片段是一个例子: plot(x, y) } else ...