笔记参考

https://github.com/TigerHee/shareJS/blob/master/webpack4.md

https://github.com/1better/mywebpack/blob/master/webpack%E7%AC%94%E8%AE%B0/webpack%E5%AD%A6%E4%B9%A0…01.md

yarn 安装淘宝镜像源
yarn config set registry ‘https://registry.npm.taobao.org

webpack安装

注:安装前先 nom 初始化

  1. npm init
  2. npm i webpack webpack-cli -D

-D 开发依赖,表示上线的时候不需要

webpack可以进行0配置

  • 打包工具 =》 输出后的结果(js模块)
  • 打包(支持我们的js的模块化)

手动配置webpack

  • 默认配置文件的名字 ```javascript let path = require(‘path’) //相对路径变绝对路径

module.exports = { mode: ‘’, //模式 默认两种 production development entry: ‘./src/index.js’, //入口 output: { filename: “bundle.js”, //打包后的文件名 path: path.resolve(__dirname, “dist”), //路径必须是一个绝对路径 } }

  1. 因为是绝对路径 所以需要引入node自带的path模块<br />__dirname表示当前的目录
  2. 为什么配置文件名字叫做 webpack.config,js ?<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/618347/1595728542818-056019e2-9d27-4121-a53f-cea7bee9bf9b.png#align=left&display=inline&height=300&margin=%5Bobject%20Object%5D&name=image.png&originHeight=599&originWidth=1203&size=534743&status=done&style=none&width=602)
  3. package.json 中进行脚本配置<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/618347/1595729171351-160c69d2-3af1-4d0c-931a-f226e9cb960d.png#align=left&display=inline&height=106&margin=%5Bobject%20Object%5D&name=image.png&originHeight=106&originWidth=1074&size=18127&status=done&style=none&width=1074)
  4. <a name="KHDWL"></a>
  5. ### 本地服务
  6. 安装一个服务依赖
  7. ```javascript
  8. yarn add webpack-dev-server -D
  9. 运行 npx webpack-dev-server
  10. devServer: {
  11. port: 3000,
  12. progress: true // 滚动条
  13. contentBase: './build' // 起服务的地址
  14. open: true // 自动打开浏览器
  15. compress: true // gzip压缩
  16. }

html插件

HtmlWebpackPlugin 插件

  1. npm i html-webpack-plugin -D


  1. let HtmlWebpackPlugin = require('html-webpack-plugin')
  2. plugins: [ // 放着所有webpack插件
  3. new HtmlWebpackPlugin({ // 用于使用模板打包时生成index.html文件,并且在run dev时会将模板文件也打包到内存中
  4. template: './index.html', // 模板文件
  5. filename: 'index.html', // 打包后生成文件
  6. hash: true, // 添加hash值解决缓存问题
  7. minify: { // 对打包的html模板进行压缩
  8. removeAttributeQuotes: true, // 删除属性双引号
  9. collapseWhitespace: true // 折叠空行变成一行
  10. }
  11. })
  12. ]

样式处理

  1. yarn add css-loader style-loader -D
  1. // css-loader 作用:用来解析@import这种语法
  2. // style-loader 作用:把 css 插入到head标签中
  3. // loader的执行顺序: 默认是从右向左(从下向上)
  4. module: { // 模块
  5. rules: [ // 规则
  6. // style-loader 把css插入head标签中
  7. // loader 功能单一
  8. // 多个loader 需要 []
  9. // 顺便默认从右到左
  10. // 也可以写成对象方式
  11. {
  12. test: /\.css$/, // css 处理
  13. // use: 'css-loader'
  14. // use: ['style-loader', 'css-loader'],
  15. use: [
  16. // {
  17. // loader: 'style-loader',
  18. // options: {
  19. // insertAt: 'top' // 将css标签插入最顶头 这样可以自定义style不被覆盖
  20. // }
  21. // },
  22. MiniCssExtractPlugin.loader,
  23. 'css-loader', // css-loader 用来解析@import这种语法,
  24. 'postcss-loader'
  25. ]
  26. }
  27. ]
  28. }

自己写的样式的优先级高于打包的文件的样式
{
test: /.css$/,
use: [{
loader: ‘style-loader’,
options: {
insertAt:’top’
}
}, ‘css-loader’]
},

less样式处理

  1. yarn add less less-loader -D
  1. {
  2. test: /\.less$/, // less 处理
  3. // use: 'css-loader'
  4. // use: ['style-loader', 'css-loader'],
  5. use: [
  6. // {
  7. // loader: 'style-loader',
  8. // options: {
  9. // insertAt: 'top' // 将css标签插入最顶头 这样可以自定义style不被覆盖
  10. // }
  11. // },
  12. MiniCssExtractPlugin.loader, // 这样相当于抽离成一个css文件, 如果希望抽离成分别不同的css, 需要再引入MiniCssExtractPlugin,再配置
  13. 'css-loader', // css-loader 用来解析@import这种语法
  14. 'postcss-loader',
  15. 'less-loader' // less-loader less -> css
  16. // sass node-sass sass-loader
  17. // stylus stylus-loader
  18. ]
  19. }

抽离css文件,通过link引入

  1. yarn add mini-css-extract-plugin -D
  1. let MiniCssExtractPlugin = require('mini-css-extract-plugin')
  2. // 压缩css
  3. plugins: [
  4. new MiniCssExtractPlugin({
  5. filename: 'css/main.css'
  6. })
  7. ]
  8. {
  9. test: /\.css$/, // css 处理
  10. // use: 'css-loader'
  11. // use: ['style-loader', 'css-loader'],
  12. use: [
  13. // {
  14. // loader: 'style-loader',
  15. // options: {
  16. // insertAt: 'top' // 将css标签插入最顶头 这样可以自定义style不被覆盖
  17. // }
  18. // },
  19. // 此时不需要style-loader
  20. MiniCssExtractPlugin.loader, // 抽离
  21. 'css-loader', // css-loader 用来解析@import这种语法,
  22. 'postcss-loader'
  23. ]
  24. }

压缩 css 和 js

  1. yarn add optimize-css-assets-webpack-plugin -D

css优化项需要 在 webpack.config.js 配置中的mode改成 production 生产模式
也可以把optimization选项下的minimize设置为true,强制打开压缩,在dev下也可以压缩。因为这个属性在dev下默认是false,在pro下默认是true

  1. optimization: { //优化项
  2. minimizer: [
  3. new OptimizeCss()
  4. ]
  5. },

用了上面那个插件就必须使用下面的插件,不然js文件不会被压缩

  1. yarn add uglifyjs-webpack-plugin -D

自动添加浏览器前缀

  1. yarn add postcss-loader autoprefixer -D

在根目录新建文件夹 postcss.config.js

注意:样式处理 postcss.config.js 文件 有问题

  1. module.exports = {
  2. // plugins: [
  3. // require('autoprefixer')({
  4. // "browsers": [
  5. // "defaults",
  6. // "not ie < 11",
  7. // "last 2 versions",
  8. // "> 1%",
  9. // "iOS 7",
  10. // "last 3 iOS versions"
  11. // ]
  12. // })
  13. // ]
  14. plugins: [
  15. require('autoprefixer')({
  16. overrideBrowserslist: ['> 0.15% in CN']
  17. }) // 自动添加css前缀
  18. ]
  19. }

es6 转成 es5

  1. yarn add babel-loader @babel/core @babel/preset-env -D
  1. {
  2. test: /\.js$/,
  3. use: {
  4. loader: 'babel-loader',
  5. options: { //用babel-loader 需要把es6->es5
  6. presets:[
  7. '@babel/preset-env'
  8. ]
  9. }
  10. }
  11. },

如果写了更高级的语法 例如 es7

  1. @babel/plugin-proposal-class-properties
  1. plugins: [
  2. ["@babel/plugin-proposal-decorators", {
  3. "legacy": true
  4. }],
  5. ["@babel/plugin-proposal-class-properties", {
  6. "loose": true
  7. }]
  8. ]
  1. yarn add @babel/polyfill //不需要加上 -D

Eslint

给 js 代码添加校验

  1. yarn add eslint eslint-loader -D

https://www.bilibili.com/video/BV1a4411e7Bz

观看记录
https://www.bilibili.com/video/BV1QE411M7sj?p=8