webpack5配置demo

1、搭建项目
1)、md webpack5-demo:打开VSCode新建终端,创建webpack5-demo文件名
2)npm init -y:安装npm项目初始化
3)npm i webpack webpack-cli -D:安装webpack和webpack-cli (-D表示安装开放环境依赖)
4)入口文件编写,创建src

2、webpack.config.js基本配置

const path = require("path")

module.exports={
    //打包入口
    entry:"./src/main.js",
    //打包出口
    output:{
        // 输出文件名
        filename:"index.js",
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path:path.resolve(__dirname, "dist")
    }
}

1)新建main.js在main.js里编写
···
console.log("测试webpack")
···
2)VSCode终端输入 npx webpack运行
生成如下dist



恭喜webpack运行成功

loader配置
style-loader,css-loader安装css打包配置
执行,npm i style-loader css-loader -D
webpack.config.js编写

const path = require("path")

module.exports={
    //打包入口
    entry:"./src/main.js",
    //打包出口
    output:{
        // 输出文件名
        filename:"index.js",
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path:path.resolve(__dirname, "dist")
    },
    // loader的配置
    module:{
        rules:[
            {
            test: /\.css$/,
            use: [
                'style-loader',
                'css-loader'
                ]
            }
        ]
    },
    // plugins的配置
    plugins: [
    // 详细plugins的配置
    ],
    // 模式
    mode: 'development', // 开发模式
    // mode: 'production'
}

新建common.css文件编辑css,在main.js引入
import "./css/common.css"


在dist文件中新建index.html,引入index.js


<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width">
  <meta name="template" content="Dusty Cartridge 0.1" />
  <title>css</title>
  <script src="./index.js"></script>
</head>
<body>  
</body>
</html>

运行:npx webpack,
浏览器中运行index.html



css打包成功

less,less-loade,安装less打包配置
执行,npm i less less-loader -D
module配置

{
    test:/\.less$/,
       use:[
                  'style-loader',
                  'css-loader',
                  // 将less文件编译成css文件
                  // 需要下载 less-loader和less
                  'less-loader'
                ]
 }

创建在css中less.less,在main.js中引入import "./css/less.less"
运行:npx webpack
运行dist文件中的html



less打包配置成功

sass,sass-loade,安装sass打包配置
执行,npm i sass sass-loader -D
步骤与上面一样不在赘述
module配置

{
          test:/\.s[ac]ss$/i,
          use:[
          'style-loader',
          'css-loader', 
          'sass-loader'
         ]
 }

stylus,stylus-loade,安装sass打包配置
执行,npm i stylus stylus-loader -D
module配置

            {
                test:/\.styl(us)?$/,//两种结尾方式styl或者styus
                use:[
                    'style-loader',
                    'css-loader', 
                    'stylus-loader'
                ]
            }

html打包配置
执行,npm i html-webpack-plugin -D
在src中新建html

<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width">
  <meta name="template" content="Dusty Cartridge 0.1" />
  <title>html</title>
</head>
<body>  
</body>
</html>

删除dist
在webpack.config.js中配置
引入html-webpack-plugin



配置const HtmlWebpackPlugin= require("html-webpack-plugin")

plugins: [
    // 详细plugins的配置
    // html-webpack-plugin
    // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
    // 需求:需要有结构的HTML文件
    new HtmlWebpackPlugin({
        // 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)
        template:'./src/index.html'
    })
    ]

运行:npx webpack

css提取mini-css-extract-plugin
执行,npm i mini-css-extract-plugin -D
webpack.config.js引入
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
plugins中配置

new MiniCssExtractPlugin({
      // 对输出的css文件进行重命名
      filename: "css/style.css",
    }),

module中配置

{
        // 匹配哪些文件
        test: /\.css$/,
        // 使用哪些loader进行处理
        use: [ 
          //"style-loader",
          MiniCssExtractPlugin.loader, 
          "css-loader",
        ],
      },

运行:npx webpack

图片打包url-loader file-loader
执行,npm i url-loader file-loader -D
module配置

{
        // 默认处理不了html中img图片
        // 处理图片资源
        test: /\.(jpg|png|gif)$/,
        // 使用一个loader
        // 下载 url-loader file-loader
        loader: "url-loader",
        options: {
          // 图片大小小于8kb,就会被base64处理
          // 优点: 减少请求数量(减轻服务器压力)
          // 缺点:图片体积会更大(文件请求速度更慢)
          limit: 2 * 1024,
          // 解析时会出问题:[object Module]
          // 解决:关闭url-loader的es6模块化,使用commonjs解析
          esModule: false,
          // 给图片进行重命名
          // [hash:10]取图片的hash的前10位
          // [ext]取文件原来扩展名
          name: "[hash:10].[ext]",
          outputPath: "imgs",//路径根据项目名称自定义
        },
        type: 'javascript/auto'
      },

html图片配置
执行,npm i html-loader -D

{
        test: /\.html$/,
        // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
        loader: 'html-loader'
      }

运行:npx webpack
其他资源处理

{
        // 处理其他资源
        exclude: /\.(node_modules|html|js|css|less|sass|scss|stylus|styl|jpg|png|gif)/,       
        loader: 'file-loader',  
        options: { 
          esModule: false,
          outputPath: 'file', 
        },
        type:"javascript/auto",  
      },

devServer配置
npm i webpack-dev-server -D

devServer: {
    // 项目构建后路径
    static: {
      directory: path.join(__dirname, "public"),
    },
    // 启动gzip压缩
    compress: true,
    // 端口号
    port: 9000,
    //启动浏览器open
    open: true,
  },

package.json配置

"scripts": { 
    "dev": "webpack serve --config ./webpack.config.js" 
  },

运行命令:npm run dev
css兼容性处理
执行安装,npm i postcss-loader postcss-preset-env -D
module

{ 
        test: /\.css$/, 
        use: [ 
          "css-loader", 
          {
            loader: "postcss-loader", 
            options: {
              postcssOptions: {
                // postcss的插件
                plugins:[require("postcss-preset-env")],
              },
            },
          },
        ],
      }

package.json配置
development//表示开发环境
production//表示生产环境

"browserslist": {
    "development": [
      "last 3 chrome version",
      "last 3 firefox version",
      "last 3 safari version"
    ],
    "production": [
      ">0.02%",
      "not dead",
      "not op_mini all"
    ]
  }

在css中编辑

h{
  display: flex; 
  transform:rotate(10deg)
}

编译后

h{
display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: flex;
-webkit-transform:rotate(10deg);
-moz-transform:rotate(10deg);
 transform:rotate(10deg)
}

css压缩
安装:npm i css-minimizer-webpack-plugin -D
webpack.config头部引入
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
plugins: 中添加
new CssMinimizerPlugin()
html压缩

plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      // 压缩html代码
      minify: {
        // 移除空格
        collapseWhitespace: true,
        // 移除注释
        removeComments: true
      }
    })
  ],

更多配置看官方文档:https://github.com/jantimon/html-webpack-plugin#options

js压缩
只需要讲mode模式调整成production模式
如:mode: "production"

js语法检查
执行:npm i eslint eslint-webpack-plugin -D
https://webpack.docschina.org/plugins/eslint-webpack-plugin/#fix
webpack.config引入
const ESLintPlugin = require("eslint-webpack-plugin");
plugins中配置

new ESLintPlugin({
      extensions: ["js"],
      //context: resolve("src"),
      exclude: "/node_modules",
       // 自动修复eslint的错误
      fix: true
    })

其检查规范配置借鉴大众认可的,airbnb插件
运行:npm i eslint-config-airbnb-base eslint-plugin-import -D
airbnb-base:https://www.npmjs.com/package/eslint-config-airbnb-base
然后再package.json中配置:

"eslintConfig":{
    "extends":"airbnb-base",
    "env": {
          "browser": true // 支持浏览器端全局变量
    }
}

js兼容性处理
下载:npm i babel-loader @babel/core @babel/preset-env -D
https://webpack.docschina.org/loaders/babel-loader/
1
全部js兼容性处理:npm i @babel/polyfill -D
module中配置:

      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: { 
          presets: ['@babel/preset-env' ]
        }
      }

兼容的js⬇

import '@babel/polyfill'; //js文件中引入
const add = (x, y) => {
  return x + y;
};
console.log(add(8, 8));

2
按需加载:npm i core-js -D
module中配置:

{
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: { 
          presets: [
            [
              '@babel/preset-env',
              {
                // 按需加载
                useBuiltIns: 'usage',
                // 指定core-js版本
                corejs: {
                  version: 3
                },
                // 指定兼容性做到哪个版本浏览器
                targets: {
                  chrome: '60',
                  firefox: '60',
                  ie: '9',
                  safari: '10',
                  edge: '17'
                }
              }
            ]
          ]
        }
      }

devtool source map构建代码出错提示
https://webpack.docschina.org/configuration/devtool/#devtool

module.exports = {
//source-map,eval-source-map提示具体部位错误
devtool: 'eval-source-map',
}

tree shaking:去除无用代码
https://webpack.docschina.org/guides/tree-shaking/

  1. 必须使用ES6模块化 2) 开启production环境
    作用: 减少代码体积
    "sideEffects": false 所有代码都没有副作用都可以进行tree shaking
    问题:可能会把css / @babel/polyfill (副作用)文件干掉
    "sideEffects": [".css", ".less"]
    \color{red}{注意:}如有测试console.log没有被调用到的方法等,会被去除
    在package.json中配置
"sideEffects": [
    "*.css"
  ]

clean-webpack-plugin
npm i clean-webpack-plugin -D
https://www.npmjs.com/package/clean-webpack-plugin
它的作用就是每次打包的时候,都会把 dist 目录清空,防止文件变动后,还有残留一些老的文件,以及避免一些缓存问题
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

plugins: [
    new CleanWebpackPlugin()
]

生成文件目录清空2
output设置,同理清空

output: {
    clean: true, // 在生成文件之前清空 output 目录
  },

webpack-merge合并两个配置文件
npm i webpack-merge -D
1)创建webpack.base.config
2)在webpack.dist.prod.config文件中引入下面代码
const {merge} = require("webpack-merge");
const webpackBaseConfig = require("./webpack.base.config.js");
合并
const prodConfig={...}
module.exports = merge(webpackBaseConfig,prodConfig);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容