项目初始化
- 新建一个目录:my-webpack-demo
- 进入项目目录yarn init
- 在项目文件新建一个src/index.js 随便写点代码

- 安装webpack,webpack-cli
package.json devDependencies:
现在的项目看起来是:
命令行运行:$npx webapcke
报错了,mode选项没有设置,是环境变量的问题,但是dist还是打包出来了。
他直接省略了变量的声明了,非常的简洁。
解决mode报错
新建一个文件webpack.config.js
再重新运行 $npx webpack
ok, 没有警告了,dist文件的输出也是没有问题的。
让webpack输出的代码支持IE
只要加一个文件就可以了:
.browserslistrc
[production] // 环境,在production环境下> 1% // 要支持全世界大于1%的浏览器ie 9 // 至少要支持ie 9[modern] // 开发环境last 1 chrome version // 支持最新的chrome版本last 1 firefox version // 支持最新的firefox版本[ssr]node 12
用babel-loader打包JS
其实webpack5已经可以打包js了,但是babel-loader有更多的功能,比如说babel-loader还可以打包typescript。
安装:
$ yarn add -D babel-loader @babel/core @babel/preset-env webpack
webpack的配置最好不要自己写
所以直接看文档https://webpack.js.org/loaders/babel-loader/
文档是github就看GitHub的,其次就是webpack官方的了。
再稍微改一下,让他能顺便匹配上jsx
webpack.config.js:
module.exports = {mode:'production',module: {rules: [{test: /\.jsx?$/,exclude: /node_modules/, // 排除node_modules的文件,// node里面的文件实际上是打包好的,所以不需要去打包他use: {loader: 'babel-loader', // 使用babel-loaderoptions: {presets: ['@babel/preset-env'] //预先的规则集合 pre sets}}}]}}
这样写了之后,就不是用webpack去打包js了,而是用webpack调用babel-loader去对js进行打包
运行打包:yarn build

ok~ 没有问题
用babel-loader打包JSX
使用的规则是 perset-react
https://www.babeljs.cn/docs/babel-preset-react
主要是他预设了以下的三个插件
它已经帮我们都配好了,那我们做的事情就会简单很多。
而且我们之前的已经在正则上加了匹配jsx,只需要在presets里面加上preset-react就好了
创建一个jsx文件测试一下
jsx-demo.jsx
index.js
yarn build
成功了,检查一下dist
没有问题
但是没有引入react,应该使用的时候是会出错的。
webstorm居然没有给提示,所以需要想个办法让他提示。
给webpack配置ESLint插件
新建一个文件: .eslintrc.js
module.exports ={extends: ['react-app'], //react团队配好的eslint规则rules:{// 2的意思是:没有使用就报错'react/jsx-uses-react':[2],//提示要在JSX文件里手动引入React'react/react-in-jsx-scope':[2]}}
还需要在webstorm里面开启eslint
然后就有提示啦
加上就消失了
但是这是webstorm给我们的提示,我们需要给webpack给我们加上。这时就需要用到plugins
https://github.com/webpack-contrib/eslint-webpack-plugin
按照他的文档说法加就好了

然后presets里面也要加上{runtime:’classic’}
因为从17版本开始,react提供了两种使用jsx的方法,classic就是经典用法(旧的),大部分公司也是使用16.8这样的经典版本。所以这里强制指定使用经典版
现在可以build试一下了
没有问题的
用babel-loader打包TypeScript
创建ts-demo.ts文件
const x:string = 'typescript'export {x}
很幸运,babel也已经帮我们弄了presset,只需要改两个地方就可以了
[jt]就是j或t都可以,再加上preset-typescript即可。
yarn build
在dist里面也是可以找到typescript的:
让ESLint支持typescript
.eslintrc.js
module.exports ={extends: ['react-app'],rules:{// 2的意思是:没有使用就报错'react/jsx-uses-react':[2],//提示要在JSX文件里手动引入React'react/react-in-jsx-scope':[2]},overrides: [{files: ['*.ts', '*.tsx'],parserOptions: {project: './tsconfig.json',},extends: ['airbnb-typescript'],rules: {'@typescript-eslint/object-curly-spacing': [0],'import/prefer-default-export': [0],'no-console': [0],'import/extensions':[0]}}]}
再在webpack.config.js里面的eslint插件里面加上ts,tsx
build
用babel-loader打包TSX
新建一个tsx-demo.tsx
然后发现报错。
目前tsx并没有被ts支持,所以需要修改以下tsconfig.json
先初始化tsconfig.json文件
$ npx tsc —init
他会创建一个很多东西的tsconfig.json:
要修改一下
将
改成
让ts知道jsx是react的,div是要变成React.createElemnt的div才可以
将
改成
我玩不太来ts的严格模式,所以改掉,再开启一个稍微不那么严格的模式开起来。
然后就没有报错了
再引入到index文件去使用并打包测试
回车换行出问题了 本来应该是‘LF’变成了‘CRLF’
但是用webstorm帮我解决了这个问题,一直点他的提示就可以了。
vscode谷歌一下就可以了。
让JS和TS分别支持@alias
js
ts
tsconfig加上:
让webpack支持SCSS
文档https://webpack.docschina.org/loaders/sass-loader/
抄文档就可以了
在webpack config文件里:
是从上往上看的,将sass装换成css,css再转换成CommonJS模块,最后将JS字符串生成style节点
写一个简单的scss文件用于测试
然后打包完在dist里面找
找到了 没有问题
SCSS自动import全局文件
将loader变成一个对象,并写上想要的options就可以了
后面的分号很重要,不然会报错。
JS获取SCSS的变量
这样可以很方便地帮助我们管理js和css中的样式
需要新起一个文件scss-export.scss,用来export变量出去,而不是在scss-vars里面export,否则会有bug
scss-export.scss
然后是需要改一下webpack-config
将css-loader改成
这个到处scss变量是通过css进行编译的,就可以支持export语法,也就是说,这个不是scss提供的功能,而是css提供的高级功能
让webpck支持LESS文件
很显然,跟SCSS差不多,在rules里把loader加上去就可以了
LESS自动import全局文件
跟SCSS差不多
当引入less或scss文件时,在路径上加上 ~ 符号是比较保险的。
JS获取LESS的变量
其实上面已经配好了,就是这一段
可以直接在变量文件中export
:export是webstorm不认识的伪类
让webstorm将不认识的伪类识别从报错变成警告:
太多CSS的处理了,优化一下
声明一个cssLoaders去处理,将LESS和SCSS重复的部分抽出来,将不同的地方通过参数传入cssLoaders处理。
const cssLoaders = (...loaders)=>['style-loader',{loader:'css-loader',options: {modules: {compileType: 'icss',}}},...loaders]
然后改一下各个test
{test: /\.s[ac]ss$/i,use:cssLoaders({loader: 'sass-loader',options: {additionalData:`@import "src/scss-vars.scss";`,sassOptions:{includePaths:[__dirname]}}})}
其实就是将use改了,把不同的部分当做对象传入cssLoaders。
在生产环境提取单独的CSS文件
提取CSS文件,并给文件夹hash,可以方便缓存
用到的插件是MiniCssExtractPlugin
文档https://webpack.js.org/plugins/mini-css-extract-plugin/
抄文档就可以了:
- 安装并引入 const MiniCssExtractPlugin = require(‘mini-css-extract-plugin’);
- 把MiniCssExtractPlugin 放到plugins里面

- 把MiniCssExtractPlugin.loader放到cssloader前面
由于之前写了个cssLoaders,所以就替换掉style-loader(一定要放在css-loader前面)
给css文件加hash
给MiniCssExtractPlugin加上options就可以了
build之后看看效果
看到有css文件有hash了
顺便给js文件也加上hash
就用到了output了

根据mode选择cssloader

就这么简单,如果是production 就延续,如果不是 就用style-loader
生产环境就提取css打包,非生产环境就不浪费性能去搞了。
就实现了css-loader的切换了
自动生成HTML页面
用到的插件是HtmlWebpackPlugin
https://webpack.docschina.org/plugins/html-webpack-plugin/
也是跟着文档抄
引入之后在pluins里面写就可以了
build完之后就可以看到html文件了
他的内容是这样的:
