深入webpack学习

Posted lin-fighting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入webpack学习相关的知识,希望对你有一定的参考价值。

npm run build



问:npm run build的时候做了什么?
答:
1 首先找到package.json中的命令行,执行webpack命令。
2 执行webpack命令,会先查看node_modules/.bin/webpack.cmd是否存在,存在就执行它。不存在就执行全局目录下的webpack.cmd。
3 找到webpack.cmd之后,会读取当前目录下的webpack.config进行编译。

多入口


entry可以是数组。会一起打包。多个入口:

可以是多个入口,但是输出的名字必须唯一。
否则会报错。
Multiple chunks emit assets to the same filename main.js (chunks index and index1)
多个模块输出的i资源有相同的名字
概念: chunks assets filename
index.js,index1.js都是属于独立的模块。比如index.js依赖index1.js。
入口文件会跟其依赖的文件打包到一起,组成代码块(chunks),再将打包的资源(asset资源,名字为main.js,内容为代码字符串),写入硬盘,生成file文件。
所以就是模块会打包成代码块(chunks),输出资源(assets),写入硬件(filename)

mode模式

  • 日常前端开发中,一般有两套构建模式。
  • 开发:构建结果用于本地开发调试,不进行代码压缩。打印debug信息,包含sourcemap文件。
  • 线上:代码都是压缩后的,运行时不打印debug信息,静态文件不包括sourcemap
  • 指定使用mode为production的时候,默认会启用各种性能优化的功能,包括构建结果优化以及weBpack运行性能优化。
  • 当指定development的时候,会开启debug工具,运行时详细打印错误信息。以及更加快速的增量编译构建。

区分环境

  • –mode 用来设置模块内的process.env.NODE_ENV
  • –env用来设置webpack配置文件的函数参数
  • cross-env用来设置node环境的process.env.NODE_ENV
  • DefinePlugin用来设置模块内的全局变量。
    可以在模块内通过process.env.NODE_ENV获取当前的环境变量。(development, production)



通过命令行传入–mode(会覆盖webpack.config.js文件的配置)只能通过process.env.NODE_ENV获取



配置文件拿不到

传入–env 用来设置webpack配置文件的函数参数

不能直接通过process.env.NODE_ENV直接获取。

他会作为函数的参数传入,
可以作为函数参数获取。

crose-env

是运行跨平台设置和使用环境变量的脚本。可以跨平台设置webpack的环境变量
在命令行直接输入NODE_ENV=production会报错,因为windows不支持。corse-env的出现就是用来帮助我们写入环境变量。可以写任意的变量,只能在webpack.config.js文件中通过process.env.xx获取,,,在模块中是获取不到的。




这里可以获取,是因为webpack的mode设置的值,才能拿到的。


模块中的Process.env.NODE_ENV拿到的是设置的mode的值。
有个疑问:


当我们打印其他值得时候,process会报错,没有找到。为什么?
因为process是node环境特有的,表示进程的意思。而我们的代码打包到浏览器环境运行的时候,是没有process这个全局变量的。
为什么process.env.NODE_ENV就可以打印呢?原来,我们已经配置好了这个值,webpack在打包的时候会直接打包成常量。如:

直接打包成Producetion了。
但是当我们使用process.env.aa的时候,因为我们没有对它做处理,所以

打包出来的是一个变量,而浏览器没有这个变量,就会报错。

definePlugin

可以设置全局变量(不是window),像process.env.NODE_ENV,所有模块都能读取,但无法node环境(webpack配置环境)中获取当前的环境变量。



配置成功。

总结

在哪个位置可以访问到process.env.NODE_ENV

配置方式在index.js中在wbepack.config.js中说明
package.json中配置mode可以访问不可以访问只能通过设置mode改变p…
package.json中配置env步可以访问可以访问参数通过参数获取,可借助DefinePlugin配置全局变量
package.json中配置cross-env不可以访问可以访问只能设置NODE_ENV
webpack中配置DefinePlugin可以不可以访问可以借助–env获取当前环境设置全局变量

dotenv

使用dotenv,只需要将程序的环境变量配置写在.env文件中就可以了。
cnpm i dotenv -D
cnpm i dotenv-expand -D


原理就是获取.env文件的内容,一行一行以=分隔,然后获取到值,然后生成process.env对象,将读取到的值存进去就行了。

以上是关于深入webpack学习的主要内容,如果未能解决你的问题,请参考以下文章

深入webpack学习

webpack 样式模块打包深入学习

深入webpack学习 devServer babel-loader asset

深入浅出的webpack构建工具--webpack4+vue搭建环境 (十三)

深入理解webpack基本配置

Webpack, 请开始你的表演