Node.js与Webpack笔记(二)

news2024/11/14 18:29:31

上一篇:Node.js与Webpack笔记(一)-CSDN博客

Webpack模块打包工具


1.Webpack简介以及体验

webpack是一个静态模块打包工具,从入口构建依赖图,打包有关的模块,最后用于展示你的内容

  • 静态模块:编写代码过程中,html,css,js,图片等固定内容的文件
  • 打包过程,注意:只有和入口有直接/间接引入关系的模块,才会被打包

2.Webpack的作用

把静态模块内容压缩、整合、转译等(前端工程化)

  • 把 less/sass 转成 css 代码

  • 把 ES6+ 降级成 ES5 等

  • 支持多种模块文件类型,多种模块标准语法

  • 压缩,转译,整合,打包我们的静态模块

4.体验Webpack

如果运行package.json里的自定义命令?

npm run 自定义命令

Webpack 默认入口和出口?
  • src/index.js 和 dist/main.js
入门使用

需求:封装 utils 包,校验手机号和验证码长度,在 src/index.js 中使用,使用 Webpack 打包

需求流程图:

1.新建项目文件夹 Webpack_study,初始化包环境,得到 package.json 文件

npm init -y

2.新建src源代码文件夹,创建src/utils/check.js工具类,封装两个函数

// 封装校验手机号长度和校验验证码长度的函数
export const checkPhone = phone => phone.length === 11
export const checkCode = code => code.length === 6

3.创建src/index.js,导入工具类check.js,调用封装好的函数

import { checkPhone, checkCode} from './utils/check.js';

console.log(checkPhone('13900000000'));
console.log(checkPhone('13900000000000'));
console.log(checkCode('123456'));
console.log(checkCode('12345678'));

4.准备webpack打包的环境,下载webpack webpack-cli到项目(版本独立)

--save-dev标注开发环境使用

管理员权限

npm i webpack webpack-cli --save-dev

5.此时可以使用webpack的打包命令webpack了

这一段视频没细讲,我大概的理解是

webpack打包命令就叫做webpack,但这个命令是属于webpack(全局软件包)的,封装的是命令工具,然后有句话没听懂“为了保证项目之间版本分别独立,所以这次比较特殊,下载到某个项目环境下,但是需要把 webpack 命令配置到 package.json 的 scripts 自定义命令,作为局部命令使用 ”

反正就是在package.json中的script中,自定义命令(局部命令),命名为build,但实际上调用的还是全局命令webpack,只在本项目中使用

6.运行工具命令,采用自定义命令的方式(局部命令)

npm run build

7.打包结果

        生成dist分发文件夹(压缩和优化后,最终运行的代码),默认生成main.js


5.Webpack修改入口和出口

步骤

1.在项目根目录,创建Webpack.config.js配置文件

2.根据文件路径创建文件夹

3.导出配置对象,配置入口、出口文件路径

const path = require('path');

module.exports = {
    entry: path.resolve(__dirname, './src/login/index.js'),
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: './login/index.js'
    }
}

4.重新打包观察

6.黑马资源删了太多,转硅谷

官网笔记

Webpack5视频_Webpack5技术视频教程_尚硅谷Webpack5视频下载 (atguigu.com)

官网文档是用Vuepress开发的,暂时也不清楚这是什么东西,使用方式是(管理员权限

7.Webpack初识

为什么需要打包工具?

开发时,我们会使用框架(React、Vue),ES6 模块化语法,Less/Sass 等 css 预处理器等语法进行开发。

这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、Css 等语法,才能运行。

所以我们需要打包工具帮我们做完这些事。

除此之外,打包工具还能压缩代码、做兼容性处理、提升代码性能等。

webpack是什么?

Webpack 是一个静态资源打包工具。

它会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去。

输出的文件就是编译好的文件,就可以在浏览器段运行了。

我们将 Webpack 输出的文件叫做 bundle

到底要学习webpack什么?

Webpack 本身功能比较少,只能处理 js 、json资源,一旦遇到 css 等其他资源就会报错。

所以我们学习 Webpack,就是主要学习如何处理其他资源。

如果不做任何配置,webpack的功能是很有限的,只能处理js代码,不能处理样式代码等

Webpack 本身功能是有限的:

  • 开发模式:仅能编译 JS 中的 ES Module 语法

  • 生产模式:能编译 JS 中的 ES Module 语法,还能压缩 JS 代码

入门体验
1.资源目录
webpack_code # 项目根目录(所有指令必须在这个目录运行)
    └── src # 项目源码目录
        ├── js # js文件目录
        │   ├── count.js
        │   └── sum.js
        └── main.js # 项目主文件
2.编写代码
  • count.js
export default function count(x, y){
    return x - y;
}
  • sum.js
export default function sum(...args){
    return args.reduce((result, item) => result + item, 0);
}
  • main.js
import count from './js/count.js';
import sum from './js/sum.js';

console.log(count(2,1)); // result: 1
console.log(sum(1,2,3,4)); // result: 10
 3.下载依赖
  • 初始化package.json

包描述文件package.json中的name值不允许为webpack,因为被占用,否则webpack依赖就下载失败

别忘了看一下默认入口是否需要修改

  • 下载依赖

下载两个依赖,一个webpack一个webpack-cli,选择开发环境-D或者-save-dev

4.启用Webpack打包项目

黑马这里教的是在package.json的script中,自定义命令"build": "webpack",将全局命令当做局部命令使用

命令npx,这个命令会将依赖包中的.bin目录临时添加到环境变量

可以运行这些.cmd程序

  • 开发模式

仅仅对ES6语法进行编译

npx webpack ./src/main.js --mode=development

打包完成自动生成dist文件夹

  • 生产模式

不仅编译ES6语法,还有压缩等功能

npx webpack ./src/main.js --mode=production

  • 总结
npx webpack: 是用来运行本地安装 Webpack 包的。

./src/main.js: 指定 Webpack 从 main.js 文件开始打包,不但会打包 main.js,还会将其依赖也一起打包进来。

--mode=xxx:指定模式(环境)。
xxx: development 开发模式
xxx: production生产模式
5.测试

创建静态html,引入打包输出的/dist/main.js,查看是否成功打包相关联的三个js文件

控制台效果

8.Webpack5大核心概念

在学习配置Webpack之前,先了解核心概念

entry(入口)
指示 Webpack 从哪个文件开始打包

output(输出)
指示 Webpack 打包完的文件输出到哪里去,如何命名等

loader(加载器)
webpack 本身只能处理 js、json 等资源,其他资源需要借助 loader,Webpack 才能解析

plugins(插件)
扩展 Webpack 的功能

mode(模式)
主要由两种模式:

开发模式:development
生产模式:production

9.Webpack配置 (webpack.config.js)

webpack.config.js配置文件运行在node.js环境中,所以Node.js模块化使用的是CommonJS模块化

在项目根目录创建,注意大小写

配置一个等价于原始webpack功能

注意看,只是配置了,打包入口和出口,配置了开发模式,无插件无加载器,等价于没有配置,依旧不能处理样式文件等,等价于 npx webpack ./src/main.js --mode=development

// 顺序无要求

// node.js核心模块path,专门处理路径
const path = require('path');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 全部文件输出路径
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "main.js",
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
    ],
    // 模式
    mode: "development",// 选择开发模式
}

但是,打包命令就可以写的简单一点了

开发模式配置
开发模式顾名思义就是我们开发代码时使用的模式。

这个模式下我们主要做两件事:

1.编译代码,使浏览器能识别运行
开发时我们有样式资源、字体图标、图片资源、html 资源等,webpack 默认都不能处理这些资源,所以我们要加载配置来编译这些资源

2.代码质量检查,树立代码规范
提前检查代码的一些隐患,让代码运行时能更加健壮。

提前检查代码规范和格式,统一团队编码风格,让代码更优雅美观。
处理各种文件资源

本章节我们学习使用 Webpack 如何处理 Css、Less、Sass、Scss、Stylus 样式资源

Webpack 本身是不能识别样式资源的,所以我们需要借助 Loader 来帮助 Webpack 解析样式资源

我们找 Loader 都应该去官方文档中找到对应的 Loader,然后使用

官方文档找不到的话,可以从社区 Github 中搜索查询

官方文档:Loaders | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)


1.处理CSS样式资源

如果使用css-loader,需要安装Webpack@5

  • 首先需要安装 css-loader 与 style-loader
// css-loader将css资源编译成CommonJS的模块到JS中
npm install --save-dev css-loader

// style-loader将js中的css通过创建style标签的方式添加到html文件中生效
npm install --save-dev style-loader 
  • 创建.css文件
span {
    color: red;
}

  • 在入口文件导入css文件

  • 配置
// node.js核心模块path,专门处理路径
const path = require('path');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "main.js",
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
    ],
    // 模式
    mode: "development",// 选择开发模式
}
  • 运行webpack


2.处理Less、Sass、Scss、Stylus样式资源

CSS、less、Sass、Scss、Stylus的认识-CSDN博客

css-loader | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

暂时只学过Sass,就不详细写了,这段教程跳过,配置也差不多,唯一注意Scss是Sass的升级版,其实一样的,需要什么loader直接下载就好

const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.js",
  },
  module: {
    rules: [
      {
        // 用来匹配 .css 结尾的文件
        test: /\.css$/,
        // use 数组里面 Loader 执行顺序是从右到左
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader"],
      },
      {
        test: /\.s[ac]ss$/,
        use: ["style-loader", "css-loader", "sass-loader"],
      },
      {
        test: /\.styl$/,
        use: ["style-loader", "css-loader", "stylus-loader"],
      },
    ],
  },
  plugins: [],
  mode: "development",
};
3.处理图片资源

过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理

现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了,我们只需要简单配置即可处理图片资源

在官网搜索“资源模块”,有相关内容

资源模块 | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

  • 配置

图形优化,将小于某个大小的图片转化成 data URI 形式(Base64 格式)

// node.js核心模块path,专门处理路径
const path = require('path');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "main.js",
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
            }
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
    ],
    // 模式
    mode: "development",// 选择开发模式
}
  • 准备资源

准备一个盒子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../dist/main.js"></script>
</head>
<body>
    <span>hello webpack</span>
    <br>
    <!-- <div class="imgDiv01">
        <img src="../img/01.png" alt="图片加载失败喔,原图片是个科技脸美女">
        <img src="../img/02.png" alt="加载失败">
    </div> -->
    <div class="imgDiv01">
        
    </div>
</body>
</html>

准备样式,被盒子背景插个图片

span {
    color: red;
}
.imgDiv01{
    /* max-width: 100%;
    height: auto; */
    width: 100px;
    height: 100px;
    background-image: url('../../img/01.png');
    background-size: cover;
}
  • 打包

此时会发现输出目录dist里多了一张图片(如果图片小于10kb,那么依旧会下载js文件中)

  •  运行


4.为什么样式文件没有单独输出为一个文件,而是写在js中?

因为经过 style-loader 的处理,样式资源打包到 main.js 里面去了,所以没有额外输出出来

5.修改输出文件目录

打包后输出的文件全放在dist目录中,太乱了,自定义输出文件目录,使得图片在img,js在js等

// [hash]表示会生成一个唯一的id
// [ext]表示原来是什么后缀扩展名,那么依旧生成什么后缀
// [query]表示有时候这个文件名后可以带有参数
generator: {
         filename: 'static/[hash][ext][query]'
       }

 

hash值生成默认20位,可以只取前8位 

  • 修改JS文件输出目录

  • 修改图片文件输出目录

官网搜索 asset

webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

// node.js核心模块path,专门处理路径
const path = require('path');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "js/main.js",
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
                generator: {
                    filename: 'static/img/[hash][ext][query]',
                }
            }
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
    ],
    // 模式
    mode: "development",// 选择开发模式
}

6.打包时自动清空上次打包资源

webpack5新出的命令clean


7.处理文字图标资源

阿里巴巴矢量图标库:iconfont-阿里巴巴矢量图标库

bootstrap图标库:Bootstrap 图标库 · Bootstrap 官方开源图标(icon)库 (bootcss.com)

我们这里使用阿里巴巴矢量图标库

  • 选择自己喜欢的图标然后入库

  • 将图标添加到项目中

  • 一键下载至本地

  • 解压后浏览器运行index文件查看教程

一般使用Font class,兼容性ie8,代码最简洁

1. 引入.css

2. 使用类名标注

  • 将css文件复制到项目中

新的css别忘记引入入口文件

  • 将css依赖的字体文件复制到项目中

  • 修改依赖的字体文件的路径

  • 配置字体图标输出路径

// node.js核心模块path,专门处理路径
const path = require('path');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "./js/main.js",
        clean: true,
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
                generator: {
                    filename: './static/img/[hash:8][ext][query]',
                }
            },
            // 处理字体图标文件
            {
                test: /\.(ttf|woff2?)$/,
                type: "asset/resource",
                generator: {
                    filename: './static/media/[hash:8][ext][query]',
                }
            }
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
    ],
    // 模式
    mode: "development",// 选择开发模式
}


8.type: asset与 type: asset/resource的区别
  1. type: "asset/resource" 相当于file-loader, 将文件转化成 Webpack 能识别的资源,其他不做处理
  2. type: "asset" 相当于url-loader, 将文件转化成 Webpack 能识别的资源,同时小于某个大小的资源会处理成 data URI 形式

9.处理音视频资源

webpack会对音视频资源原封不动的输出出去,不会做任何改动

打包后发现并不会输出视频文件到dist目录中


10.处理JS文件资源

有人可能会问,js 资源 Webpack 不能已经处理了吗,为什么我们还要处理呢?

原因是 Webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器运行,IE浏览器根本不支持任何ES6语法,所以我们希望做一些兼容性处理,至少能在IE11看到运行效果。

其次开发中,团队对代码格式是有严格要求的,多个程序猿开发同一个项目需要规范格式,我们不能由肉眼去检测代码格式,需要使用专业的工具来检测。

  • 针对 js 兼容性处理,我们使用 Babel 来完成
  • 针对代码格式,我们使用 Eslint 来完成

我们先完成 Eslint,检测代码格式无误后,在由 Babel 做代码兼容性处理

11.Eslint介绍

官网:文档 - ESLint 中文网 (nodejs.cn)

是一个可组装的 JavaScript 和 JSX 检查工具。

这句话意思就是:它是用来检测 js 和 jsx 语法的工具,可以配置各项功能

我们使用 Eslint,关键是写 Eslint 配置文件,里面写上各种 rules 规则,将来运行 Eslint 时就会以写的规则对代码进行检查

  • 为什么Eslint支持JS原生和React的JSX,而不支持VUE呢?

Eslint的开发团队是Facebook旗下的,自然要支持自家的React

不过不用担心,Eslint是一个可组装的工具,添加一些插件,就支持VUE模板语法了

  • Eslint的配置文件有至少四种写法

ESLint 会查找和自动读取它们,所以以上配置文件只需要存在一个即可

js格式可以写注释,更符合日常写代码的习惯,所以选择js格式


module.exports = {
  // 解析选项
  parserOptions: {},
  // 具体检查规则
  rules: {},
  // 继承其他规则
  extends: [],
  // ...
};
  • parserOptions解析选项
parserOptions: {
  ecmaVersion: 6, // ES 语法版本
  sourceType: "module", // ES 模块化
  ecmaFeatures: { // ES 其他特性
    jsx: true // 如果是 React 项目,就需要开启 jsx 语法
  }
}
  • rules规则
  • "off" 或 0 - 关闭规则
  • "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
  • "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

官方规则文档:规则参考 - ESLint - 插件化的 JavaScript 代码检查工具

rules: {
  semi: "error", // 禁止使用分号
  'array-callback-return': 'warn', // 强制数组方法的回调函数中有 return 语句,否则警告
  'default-case': [
    'warn', // 要求 switch 语句中有 default 分支,否则警告
    { commentPattern: '^no default$' } // 允许在最后注释 no default, 就不会有警告了
  ],
  eqeqeq: [
    'warn', // 强制使用 === 和 !==,否则警告
    'smart' // https://eslint.org/docs/latest/rules/eqeqeq#smart 
//除了少数情况下不会有警告
  ],
}
  •  extends继承

开发中一点点写 rules 规则太费劲了,所以有更好的办法,继承现有的规则。

继承官方的规则不用下载,如果其他规则需要下载

// 例如在React项目中,我们可以这样写配置
module.exports = {
  extends: ["react-app"],
  rules: {
    // 我们的规则会覆盖掉react-app的规则
    // 所以想要修改规则直接改就是了
    eqeqeq: ["warn", "smart"],
  },
};
  • Eslint官方内置规则 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具

在配置文件中写上 "extends": "eslint:recommended"

  • Vue-cli官方的规则 vue-cli/packages/@vue/cli-plugin-eslint at dev · vuejs/vue-cli · GitHub
  • React-cli官方的规则 create-react-app/packages/eslint-config-react-app at main · facebook/create-react-app · GitHub
12.在webpack5中使用Eslint

在webpack4中是用一个loader处理Eslint,在webpack5中则是plugin

EslintWebpackPlugin | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

测试需求,配置检查src下的所有文件不能出现var变量

  • 安装插件
npm i eslint eslint-webpack-plugin --save-dev

 

  • 定义.eslintrc.js配置文件
module.exports = {
    // 继承 Eslint 规则
    extends: ["eslint:recommended"],
    env: {
      node: true, // 启用node中全局变量
      browser: true, // 启用浏览器中全局变量
    },
    parserOptions: {
      ecmaVersion: 6,
      sourceType: "module",
    },
    rules: {
      "no-var": 2, // 不能使用 var 定义变量
    },
  };
  
  • webpack.config.js中引入与管理插件

// node.js核心模块path,专门处理路径
const path = require('path');

// Eslint插件
const ESLintPlugin = require('eslint-webpack-plugin');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "./js/main.js",
        clean: true,
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            {
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
                generator: {
                    filename: './static/img/[hash:8][ext][query]',
                }
            },
            // 处理字体图标文件,以及媒体文件
            {
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: "asset/resource",
                generator: {
                    filename: './static/media/[hash:8][ext][query]',
                }
            }
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
        new ESLintPlugin({
            // context指定需要检查的文件根目录,即src下的所有文件都会被检查
            context: path.resolve(__dirname, './src'),
        }),
    ],
    // 模式
    mode: "development",// 选择开发模式
}
  • 故意犯错 

 

  • 打包结果

13.VSCode-Eslint插件

这个插件可以实时检测代码格式,就不用编译的时候才去报错了

但是此时就会对项目所有文件默认进行 Eslint 检查了,我们 dist 目录下的打包后文件就会报错。但是我们开发时候只需要检查 src 下面自己写的源代码,不需要检查 dist 下面的文件。

所以可以使用 Eslint 忽略文件解决。在项目根目录新建下面文件:

  • .eslintignore
# 忽略dist目录下所有文件
dist

 .eslintignore有可能不生效,有一个办法是在.eslintrc.js中写上:

网上也有其他办法,但是暂时也不会用

VSCode ESLint 插件 .eslintignore 文件不生效原因[转] – 后除 (mazey.net)

  • .eslintrc.js
module.exports = {
    // 继承 Eslint 规则
    extends: ["eslint:recommended"],
    env: {
      node: true, // 启用node中全局变量
      browser: true, // 启用浏览器中全局变量
    },
    parserOptions: {
      ecmaVersion: 6,
      sourceType: "module",
    },
    rules: {
      "no-var": 2, // 不能使用 var 定义变量
    },
    ignorePatterns: ["dist"],
  };
  

14.Babel介绍

Babal在webpack中是用一个loader去处理

babel-loader | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

Babel 是什么? · Babel 中文文档 | Babel中文网 (babeljs.cn)

JavaScript 编译器。

主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中,比如ES6的箭头函数等,typescript等

配置文件由很多种写法:

  • babel.config.*:新建文件,位于项目根目录
    • babel.config.js
    • babel.config.json
  • .babelrc.*:新建文件,位于项目根目录
    • .babelrc
    • .babelrc.js
    • .babelrc.json
  • package.json 中 babel:不需要创建文件,在原有文件基础上写

Babel 会查找和自动读取它们,所以以上配置文件只需要存在一个即可

这里选择js文件的形式配置

  • babel的预设

babel本身什么都做不了,它的关键在于它的预设presets

简单理解:就是一组 Babel 插件, 扩展 Babel 功能

  • @babel/preset-env: 一个智能预设,允许您使用最新的 JavaScript。
  • @babel/preset-react:一个用来编译 React jsx 语法的预设
  • @babel/preset-typescript:一个用来编译 TypeScript 语法的预设
15.在Webpack5中使用Babel
  • 安装依赖
npm install -D babel-loader @babel/core @babel/preset-env
  • 根目录创建babel.config.js
module.exports = {
    // @babel/preset-env: 一个智能预设,允许您使用最新的 JavaScript。
    // @babel/preset-react:一个用来编译 React jsx 语法的预设
    // @babel/preset-typescript:一个用来编译 TypeScript 语法的预设
    presets: ["@babel/preset-env"],
}
  • webpack.config.js引入loader

// node.js核心模块path,专门处理路径
const path = require('path');

// Eslint插件
const ESLintPlugin = require('eslint-webpack-plugin');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "./js/main.js",
        clean: true,
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            { 
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
                generator: {
                    filename: './static/img/[hash:8][ext][query]',
                }
            },
            // 处理字体图标文件,以及媒体文件
            {
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: "asset/resource",
                generator: {
                    filename: './static/media/[hash:8][ext][query]',
                }
            },
            // Babel, JS解析器
            {
                test: /\.js$/, 
                exclude: /node_modules/, // 第三方的js文件我们不处理,exclude: 排除
                loader: 'babel-loader',
              },
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
        new ESLintPlugin({
            // context指定需要检查的文件根目录,即src下的所有文件都会被检查
            context: path.resolve(__dirname, './src'),
        }),
    ],
    // 模式
    mode: "development",// 选择开发模式
}
  • 打包测试

源输出js还有ES6的箭头函数

变成ES5写法了


16.处理HTML资源

HTML不再需要自己手动引入打包后的js文件了,千万不要手动引入了

新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源

该插件将为你生成一个 HTML5 文件, 在 body 中使用 script 标签引入你所有 webpack 生成的 bundle。  

如果你有多个 webpack 入口,他们都会在已生成 HTML 文件中的 <script> 标签内引入。

如果在 webpack 的输出中有任何 CSS 资源(例如,使用 MiniCssExtractPlugin 提取的 CSS),那么这些资源也会在 HTML 文件 <head> 元素中的 <link> 标签内引入。

webpack官网搜索:HtmlWebpackPlugin

HtmlWebpackPlugin | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

  • webpack.config.js

// node.js核心模块path,专门处理路径
const path = require('path');

// 处理HTML文件
const HtmlWebpackPlugin = require('html-webpack-plugin');

// Eslint插件
const ESLintPlugin = require('eslint-webpack-plugin');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "./js/main.js",
        clean: true,
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            { 
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
                generator: {
                    filename: './static/img/[hash:8][ext][query]',
                }
            },
            // 处理字体图标文件,以及媒体文件
            {
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: "asset/resource",
                generator: {
                    filename: './static/media/[hash:8][ext][query]',
                }
            },
            // Babel, JS解析器
            {
                test: /\.js$/, 
                exclude: /node_modules/, // 第三方的js文件我们不处理,exclude: 排除
                loader: 'babel-loader',
              },
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
        new ESLintPlugin({
            // context指定需要检查的文件根目录,即src下的所有文件都会被检查
            context: path.resolve(__dirname, './src'),
        }),
        new HtmlWebpackPlugin({
            // 以 public/index.html 为模板创建文件
            // 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
            template: path.resolve(__dirname, "public/index.html"),
        })
    ],
    // 模式
    mode: "development",// 选择开发模式
}

以原html为模板,输出一个新的html,并且自动引入多个bundle,相关依赖也自动引入,有多少引入多少

  • 打包

  • 运行依旧没问题


开发服务器&自动化

每次改动代码后需要重新编译打包npx webpack,也可以自动化

webpack-dev-server是webpack官方提供的一个小型Express服务器。使用它可以为webpack打包生成的资源文件提供web服务。

主要提供了2个功能:

  1. 为静态文件提供服务
  2. 自动刷新和热替换(HMR)

并且当你使用开发服务器时,所有代码都会在内存中编译打包,并不会输出到 dist 目录下

开发时我们只关心代码能运行,有效果即可,至于代码被编译成什么样子,我们并不需要知道。

  • 安装依赖
npm i webpack-dev-server -D
  • webpack.config.js

// node.js核心模块path,专门处理路径
const path = require('path');

// 处理HTML文件
const HtmlWebpackPlugin = require('html-webpack-plugin');

// Eslint插件
const ESLintPlugin = require('eslint-webpack-plugin');

module.exports = {
    // 入口
    entry: "./src/main.js",// 使用相对路径
    // 输出
    output: {
        // __dirname node.js的变量,获取当前项目根目录的绝对路径
        // 第二个参数为目标文件的文件夹
        path: path.resolve(__dirname, "dist"),
        // 入口文件名
        filename: "./js/main.js",
        clean: true,
    },
    // 加载器:
    module: {
        rules: [
            // loader的配置
            {
                // 正则匹配一个 以 .css结尾的文件
                test: /\.css$/,
                // use 数组里面 Loader 执行顺序是从右到左
                // style-loader将js中的css通过创建style标签添加到html文件中生效
                // css-loader将css资源编译成CommonJS的模块到js中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.s[ac]ss$/,
                use: ["style-loader", "css-loader", "sass-loader"],
            },
            {
                test: /\.styl$/,
                use: ["style-loader", "css-loader", "stylus-loader"],
            },
            { 
                test: /\.(png|jpe?g|gif|webp|svg)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                      maxSize: 10 * 1024 // 小于10kb的图片,转换base64的字符串
                    },
                },
                generator: {
                    filename: './static/img/[hash:8][ext][query]',
                }
            },
            // 处理字体图标文件,以及媒体文件
            {
                test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
                type: "asset/resource",
                generator: {
                    filename: './static/media/[hash:8][ext][query]',
                }
            },
            // Babel, JS解析器
            {
                test: /\.js$/, 
                exclude: /node_modules/, // 第三方的js文件我们不处理,exclude: 排除
                loader: 'babel-loader',
              },
        ]
    },
    // 插件
    plugins:[
        // plugin的配置
        new ESLintPlugin({
            // context指定需要检查的文件根目录,即src下的所有文件都会被检查
            context: path.resolve(__dirname, './src'),
        }),
        new HtmlWebpackPlugin({
            // 以 public/index.html 为模板创建文件
            // 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
            template: path.resolve(__dirname, "public/index.html"),
        })
    ],
    // 开发服务器
    devServer: {
        host: "localhost", // 启动服务器域名
        port: "3030", // 启动服务器端口号
        open: true, // 是否自动打开浏览器
    },
    // 模式
    mode: "development",// 选择开发模式
}
 运行指令

不是npx webpack

npx webpack serve
关闭服务器 
ctrl + c
问题:视频文件失效了

ChatGPT告诉我:webpack-dev-server默认是不支持在内存中存储二进制文件(例如视频文件)的

将视频文件放置在public目录下,与index.html放在一起然后重新启动webpack-dev-server,视频就可以正常播放了,虽然我不清楚这有什么区别, 但确实有用。


(本节完)

下一节:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ky10 server 银河麒麟服务器主备搭建 (nginx+keepalived)

下载脚本代码 git clone https://gitcode.net/zengliguang/nginx_keepalived_ky10_x.git 进入脚本路径 更新脚本代码 更新完成 执行安装脚本 安装nginx离线编译安装依赖 解压nginx源码 检查环境 编译 nginx安装成功 安装keepalived keepalived安装成功

华为OD机试真题-测试用例执行计划

测试用例执行计划 题目描述&#xff1a; 某个产品当前迭代周期内有N个特性({F1,F2,...,FN})需要进行覆盖测试&#xff0c;每个特性都被评估了对应的优先级&#xff0c;特性使用其ID作为下标进行标识。 设计了M个测试用例({T1,T2,...,TM})&#xff0c;每个用例对应了一个覆盖特…

【Python刷题】环形链表

问题描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

SwiftUI之CoreData详解(一)

coreData 是一种数据持久化的方案&#xff0c;是对SQLite的一种封装。一说到这种桌面化的数据库&#xff0c;我就无比的怀念Foxbase|Foxpro, 多好的数据库产品&#xff0c;被微软扼杀了&#xff0c;相当年教大学生妹子们国家二级数据库时都是手把手教的&#xff0c;呃~~~&#…

解决火狐浏览器访问地址受限制问题(This address is restricted)

问题如下图&#xff1a; This address is restrictedThis address uses a network port which is normally used for purposes other than Web browsing. Firefox has canceled the request for your protection. 此地址受到限制 此地址使用通常用于 Web 浏览以外的目的的网…

21.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-配置数据保存到文件

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容&#xff1a;20.数据分析工具…

人才推荐 | 毕业于美国凯斯西储大学的博士,专业知识广泛

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

前端使用Ant Design中的Modal框实现长按顶部拖动弹框需求

需求&#xff1a;需要Ant Design中的一个Modal弹框&#xff0c;并且可以让用户按住顶部实现拖动操作 实现&#xff1a;在Ant Design的Modal框的基础上&#xff0c;在title中添加一个onMouseDown去记录拖拽的坐标&#xff0c;然后将其赋值给Modal的style属性 代码部分&#xff…

没有面试邀约还在怪学历?帮助1万人通过面试的简历实战经验

很多人说自己明明投了很多公司的简历&#xff0c;但是都没有得到面试邀请的机会。自己工作履历挺好的&#xff0c;但是为什么投自己感兴趣公司的简历&#xff0c;都没有面试邀请的机会。反而是那些自己没有投递的公司&#xff0c;经常给自己打电话。 造成这些现象的主要原因&am…

解决白屏问题:让你的网站重焕生机

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Ubuntu上安装任意版本nodejs方法

在Ubuntu中安装指定版本的Node.js&#xff0c;可以使用Node Version Manager (NVM)。以下是安装步骤&#xff1a; 首先&#xff0c;安装NVM。在命令行中输入&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash 这个命令会下载并…

Maya人物建模

【MAYA人物建模】超详细讲解人物嘴巴、鼻子、眼睛、耳朵、头发、帽子等布线细节&#xff0c;零基础人物头部布线教程_哔哩哔哩_bilibili 原始图像凑合用&#xff0c;视屏中截图 图像导入过程技巧总结 前视图/右视图模式下导入图形 创建图层 锁定后可以避免图片位置的移动 前视…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU&#xff08;图形处理单元&#xff09;的强大计算…

外包干了10天,技术退步明显···

先说一下自己的情况&#xff0c;本科生&#xff0c;通过校招进入杭州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&…

⭐每天一道leetcode:69.x的平方根(简单;不使用sqrt函数)

⭐今日份题目 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示…

Return On Investment (ROI)

Return On Investment &#xff08;ROI&#xff09;投资回报率 ROI (A - B) / A

图片去水印软件 Inpaint使用教程

Inpaint中文版是一款功能强大&#xff0c;实用方便的图片快速去水印软件&#xff0c;Inpaint中文版操作简单易上手&#xff0c;可以帮助你达到一键美化图片的效果。图片水印现在已经非常流行&#xff0c;能够借助一款不错的图片水印去除工具可以让图片处理工作简单便捷。本文讲…

AI大模型解锁写作技能,成为网红不是梦

AI大模型的出现改变了人们的生活方式&#xff0c;包括写作技能的提升。如今&#xff0c;想要成为网红并不是遥不可及的梦想。借助AI大模型&#xff0c;可以轻松地解锁写作技能&#xff0c;迅速积累粉丝&#xff0c;开启网红之路。 AI大模型拥有强大的计算和学习能力&#xff0…

看了很多文章,就这篇说明白了什么是接口测试!

接口&#xff08;API&#xff09;是一个简称&#xff0c;全名叫应用程序编程接口(Application Programming Interface)&#xff0c;是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解…

基于Springboot的志愿服务管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的志愿服务管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…