刚才我们也讲解了下,我们对webpack路径的一个处理,处理的话包括别名的配置,模块是如何找到并加载的,总的来说到现在webpack这个配置到现在来说还是相当的麻烦的,但是目前来说我们讲的这些东西都是一些比较基础的一些东西,当你真正理解之后每个配置其实并不复杂,后面的话这个webpack还有更加复杂的配置、还有些优化方面的东西,我们等到讲这个工程化高级的时候在聊对应的一个东西。下边我们就需要了解下webpack的插件,主要是,CleanWebpackPlugin,这个插件的作用是清除原来你打包的文件夹给你生成新的文件夹,另一个东西只要是帮助我们生成一个html的模板,还有一个就是DefinePlugin,这个东西的话是用来给我们定义一些全局变量的,你可以在你的项目里边直接使用在这个里面插入的全局变量。这个东西的话其实还是比较有用的。第五个的话就是开发模式。我们主要是讲解这个开发模式的作用
插件和Loader之间的关系,在第一次接触的时候非常容易搞混,前端面试中问的也比较多
Webpack的另一个核心是Plugin,官方有这样一段对Plugin的描述:
While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range
of tasks like bundle optimization, asset management and injection of environment variables.
上面表达的含义翻译过来就是:
Loader是用于特定的模块类型进行转换;
Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等;
以前的话我们经过Loader处理过的CSS,我们的CSS是插入到页面中的Style标签里的,我们可以通过某些插件来把这个CSS抽出来。
前面我们演示的过程中,每次修改了一些配置,重新打包时,都需要手动删除dist文件夹
首先,我们先安装这个插件:
npm install clean-webpack-plugin -D
之后在插件中配置:
另外还有一个不太规范的地方:
对HTML进行打包处理我们可以使用另外一个插件:HtmlWebpackPlugin;
npm install html-webpack-plugin -D
我们会发现,现在自动在dist文件夹中,生成了一个index.html的文件:
这个文件是如何生成的呢?
如果我们想在自己的模块中加入一些比较特别的内容:
比如添加一个noscript标签,在用户的JavaScript被关闭时,给予响应的提示;
比如在开发vue或者react项目时,我们需要一个可以挂载后续组件的根标签
;这个我们需要一个属于自己的index.html模块:
上面的代码中,会有一些类似这样的语法<% 变量 %>,这个是EJS模块填充数据的方式。
在配置HtmlWebpackPlugin时,我们可以添加如下配置:
我们把Vue的模版粘贴了一份,但是发现里边有一个变量,我们打包的时候会发现报错。这是因为那个东西是一个全局变量
但是,这个时候编译还是会报错,因为在我们的模块中还使用到一个BASE_URL的常量
这是因为在编译template模块时,有一个BASE_URL:
但是我们并没有设置过这个常量值,所以会出现没有定义的错误;
这个时候我们可以使用DefinePlugin插件;
DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安装):
这个时候,编译template就可以正确的编译了,会读取到BASE_URL的值
前面我们一直没有讲mode。
Mode配置选项,可以告知webpack使用相应模式的内置优化
这几个选项有什么样的区别呢?
如果你设置成none这种模式,那么将不会使用任务的优化手段,如果你设置成开发模式,他会将process.env.NODE_ENV的值设置为development,并且对我们模块、进行一些分包的操作,如果是production,会应用一些插件进行代码混淆压缩。不同的模式产生的效果是不一样的,
每一种Mode配置代表的选项是比较多的,这个问题我们后期的时候再研究
我们以前在修改完代码时候,我们需要从新进行打包,然后借用VsCode插件从新跑起来我们这个项目,这样的话才能看到最新的效果,每次重复这样的步骤开发效率是非常低的,我们开发中是不采用这种方式的,都是通过webpack搭建本地服务器,陪着webpack热模块替换来实现局部代码的实时更新
目前我们开发的代码,为了运行需要有两个操作:
这个过程经常操作会影响我们的开发效率,我们希望可以做到,当文件发生变化时,可以自动的完成编译和展示**;**
为了完成自动编译,webpack提供了几种可选的方式:
上面的方式可以监听到文件的变化,但是事实上它本身是没有自动刷新浏览器的功能的:
安装webpack-dev-server
修改配置文件,启动时加上serve参数:
webpack-dev-server 在编译之后不会写入到任何输出文件,而是将 bundle 文件保留在内存中:
什么是HMR呢?
HMR通过如下几种方式,来提高开发的速度:
如何使用HMR呢?
修改webpack的配置:
注意:现在的webpack默认就是开启这个东西的
浏览器可以看到如下效果:
但是你会发现,当我们修改了某一个模块的代码时,依然是刷新的整个页面:
有一个问题:在开发其他项目时,我们是否需要经常手动去写入 module.hot.accpet相关的API呢?
事实上社区已经针对这些有很成熟的解决方案了:
host设置主机地址:
localhost 和 0.0.0.0 的区别:
port设置监听的端口,默认情况下是8080
open是否打开浏览器:
compress是否为静态文件开启gzip compression:
目前我们所有的webpack配置信息都是放到一个配置文件中的:webpack.config.js
那么,在启动时如何可以区分不同的配置呢?
webpack.comm.conf.js、webpack.dev.conf.js、webpack.prod.conf.js
我们在入口中打包时指定的配置文件为对应的配置文件
但是我们需要在对应环境的配置文件中,引入公共的配置文件,我们需要用到另一个库,在早期Vue2早期的脚手架中就是通过这种方式来实现的,只不过后期他们把这种方式开发到一个service-cli这个库里面。隐藏来对应的webpack配置文件
在最新得webpack5里边新加入了一个属性 --merge这个属性,但是我个人不是很喜欢这种方式,因为他是需要在命令里区修改,这样就造成了我们这个东西太长
我们刚才说得另一个库就是webpack-merge
npm i webpack-merge -D
注意我们在写webpack相应配置的时候用的一直是Common.js的语法,为啥用这个?因为webpack这个东西最终跑在node.node支持的就是Common.js语法
所以在webpack中的配置我用的就是Common.js,那有没有办法用其他的?可以经过一些特殊的配置我们可以采用EsMoudel的规范
开发环境的需求
模块热更新 (本地开启服务,实时更新)
sourceMap (代码映射,方便打包调试)
接口代理 (配置proxyTable解决开发环境中的跨域问题)
代码规范检查 (代码规范检查工具)
生产环境的需求:
提取公共代码
压缩混淆(压缩混淆代码,清除代码空格,注释等信息使其变得难以阅读)
文件压缩/base64编码(压缩代码,减少线上环境文件包的大小)
去除无用的代码
开发环境和生产环境的共同需求:
入口
代码处理(loader处理)
解析配置