get confused and overwhelmed
文章目录
- 参考
- overview
- demo
- 备注
-
- [VS Code中用 Live Server 打开 HTML 与直接点击的区别](#VS Code中用 Live Server 打开 HTML 与直接点击的区别)
- [nodejs path 模块](#nodejs path 模块)
参考
BV11g411y7Sd
overview

主要用于将各种资源(如 JavaScript、CSS、图片等)作为模块进行管理和打包
all types of loaders and plugins that you can use
- 为什么需要有webpack?
- 传统网页开发项目中,需要通过在HTML中引入大量的JS CSS等文件,可能会导致 命名冲突、页面体积变大 ,如果是第三方库,需要加载所有的代码(第三方库 如 jQuery 通常以一个完整的文件形式提供。,比如你只用到 jQuery 的一个小功能,但实际引入的是整个
jquery.js文件,里面包含了所有功能代码) - 在nodejs出现之后,JS项目支持通过require进行模块化开发,并且支持npm方便管理依赖。借着nodejs和浏览器js的一致性,前端项目开始在nodejs下开发,完成之后把代码构建成浏览器支持的形式
- Node.js 出现之前的前端开发现状(JS 项目通常只能在浏览器环境运行,依赖管理和模块化能力较弱,难以组织大型项目)
- nodejs出现之后,Node.js 和浏览器都使用 JavaScript,开发者可以在 Node.js 环境下编写前端代码。前端项目在 Node.js 环境下开发(如使用 ES6、模块化、npm 管理依赖) ,然后通过构建工具(如 Webpack、Rollup)将代码转换为浏览器可识别的形式(如 ES5、合并打包、压缩等)。
- webpack 就是进行这一步构建操作的,把 nodejs 模块化的代码,转换为浏览器可执行的代码。在 wbp 中任何文件都可以通过 import 导入,只要有对应的 loader 就可以,在打包过程中,还可以通过插件 plugin 干预打包过程,例如剔除不必要的代码,形成体积更小的项目
- 传统网页开发项目中,需要通过在HTML中引入大量的JS CSS等文件,可能会导致 命名冲突、页面体积变大 ,如果是第三方库,需要加载所有的代码(第三方库 如 jQuery 通常以一个完整的文件形式提供。,比如你只用到 jQuery 的一个小功能,但实际引入的是整个
demo
javascript
mkdir demo
cd demo
yarn add -y (这里 -y 的意思是生成的的 package.json 文件所有的配置项都取默认值,就不会一条条询问
但我使用的是 pnpm init(Unlike `npm`, pnpm does not support the `-y` option for `init`)
pnpm i webpack webpack-cli -D 添加开发者依赖,因为 wbp 只在开发的时候有用到,她最后打包好的文件中,不需要 wbp 了
code . 打开当前目录
新建 src:放置源代码
新建 src/index.js
新建 index.html 引入 js 文件
npx webpack 这样就执行了打包命令,npx 可以直接运行 node modules下安装的库的自带的命令行,而不用 nodemodules 的相对路径
(此时 会出现 dist 目录,然后里面有一个 main.js)
讲index.html里引入的js 从src换成 dist
新建 src/data.js,随便写一个 export 语句,再在 index.js 中引入,重新 npx webpack 打包,会发现 dist/main.js 中有做简化
新建 webpack.config.js
webpack.config.js
这里面用的是 nodejs 的导出语法
javascript
module.exports = {}
mode: 写开发者模式的话,打包的 js 会多很多代码
loader
css
为什么webpack 处理 import './css' 一定需要loader?
- Webpack 允许你把各种资源(JS、CSS、图片等)都当作"模块"来导入。但本质上,只有 JS 能被直接解析和执行,其他类型的文件需要"转译"成 JS。
- JS 本身不支持直接导入 CSS。JS 本身不支持直接导入 CSS
- Loader 的作用:没有 loader,Webpack 不知道如何处理非 JS 文件,会报错。
- 当你写
import './style.css',Webpack 会调用配置好的 loader(如css-loader、style-loader): - css-loader:把 CSS 文件内容转成 JS 模块,返回字符串或对象。
- style-loader:把 CSS 内容插入到页面
<style>标签里,实现样式生效。

- 当你写
javascript
1 下载
pnpm i -D css-loader style-loader
2 配置文件中配置

javascript
module.exports = {
// ...其他配置
module: {
rules: [
{
test: /\.css$/, // 匹配所有 .css 文件
use: ['style-loader', 'css-loader'] // 使用的 loader,从后往前执行
}
]
}
}
图片
- 图片可以像 JS 模块一样
import导入。 - 需要配置合适的 loader(Webpack 5 推荐
asset/resource)。 - 导入后可以直接在代码中用变量引用图片路径。
javascript
module.exports = {
// ...其他配置
module: {
rules: [
{
test: /\.(png|jpg|jpeg|gif|svg)$/,
type: 'asset/resource', // Webpack 5 推荐用法
}
]
}
}
导入 + 使用
javascript
import logo from './assets/logo.png';
<img src={logo} alt="Logo" />
babel-loader
babel-loader 是 Webpack 的一个 Loader,用于将 ES6+、TypeScript 或其他现代 JavaScript 代码转换为兼容旧浏览器的 ES5 代码。它是 Babel 与 Webpack 的桥梁。
javascript
module.exports = {
module: {
rules: [
{
test: /\.js$/, // 匹配所有 .js 文件
exclude: /node_modules/, // 排除 node_modules
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'] // 使用 Babel 预设
}
}
}
]
}
}
plugin
html-webpack-plugin
html-webpack-plugin 插件作用:根据模板或默认配置,自动生成一个 HTML 文件,并将 webpack 打包生成的 JS/CSS 等资源自动插入到 HTML 中。
javascript
下载
pnpm i html-webpack-plugin -D
webpack.config.js 导入
const HtmlWebpackPlugin = require("html-webpack-plugin")
--------------------
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
mode: "production", // 写开发者模式的话
entry: "./src/index.js",
output: {
filename: "dist.js",
path: path.resolve(__dirname, "output")
},
plugins: [
new HtmlWebpackPlugin({
title: '博客' 传递参数
})
],
module: {
...
}
}
terser-webpack-plugin
terser-webpack-plugin 是 Webpack 官方推荐的 JavaScript 代码压缩(minify)插件
开发设置
webpack-dev-server 是专为 webpack 项目设计的开发服务器
webpack-dev-server启动后,所有打包结果(如带哈希的 JS 文件)都存储在内存中,不会真正写到你本地的dist或output目录。- 浏览器访问时,
webpack-dev-server会把内存中的最新文件直接提供给你,但你在本地文件夹里看不到这些文件。 - 怎么验证呢? 浏览器开发者工具,
<script src="...">标签引用的 JS 文件名是有变化的,但本地输出目录没有

javascript
pnpm i -D webpack-dev-server
指定去哪里加载代码
// webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
mode: "production", // 写开发者模式的话
entry: "./src/index.js",
output: {
filename: "dist.js",
path: path.resolve(__dirname, "output")
}
devServer: {
static: './output'
}
}
// package.json
{
"name": "0210_demo",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack serve --open" 加这个
}
}
文件名hash作用
- 为什么要加 hash?
- 浏览器缓存机制:浏览器会缓存静态资源(如 JS、CSS),下次访问时直接读取本地缓存,提升加载速度。
- 缓存失效问题:如果文件内容变了,但文件名没变,浏览器可能不会重新加载最新文件,导致用户看到旧代码。
- 解决方案:文件名中加上内容哈希(
contenthash),每次内容变动时,文件名也会变,浏览器自动重新下载最新文件。
javascript
module.exports = {
mode: "production", // 写开发者模式的话
entry: "./src/index.js",
output: {
// filename: "dist.js",
filename: "[name].[contenthash].js",
path: path.resolve(__dirname, "output")
},
路径别名
javascript
module.exports = {
// ...其他配置
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'utils': path.resolve(__dirname, 'src/utils'),
// 可以配置多个别名
}
}
}
备注
VS Code中用 Live Server 打开 HTML 与直接点击的区别
live server 是 vs code 的一个插件,用来实时预览 html 文件的

- Live Server 打开 HTML
- 原理:Live Server 在本地启动一个开发服务器(通常是 HTTP),通过
http://localhost:端口号访问页面。 - 优点:
- 自动刷新:保存文件后页面会自动刷新,方便开发调试。
- 模拟真实环境:以服务器方式访问,能模拟生产环境下的行为(如 AJAX、fetch、跨域等)。
- 支持相对路径:资源引用更准确,避免直接打开可能出现的路径问题。
- 支持后端接口调试:可以与本地或远程 API 进行交互。
- 典型访问方式:
http://localhost:5500/index.html
- 直接点击 HTML 文件(双击或右键用浏览器打开)
- 原理:直接用浏览器打开本地文件,访问方式为
file://协议。 - 缺点:
- 无自动刷新:修改文件后需手动刷新页面。
- 路径问题:某些资源引用(如相对路径、模块化 JS)可能因路径解析不同而出错。
- 受限于浏览器安全策略:如 AJAX 请求、fetch 等可能因同源策略被阻止。
- 无法模拟服务器环境:部分功能(如路由、后端接口)无法正常测试。
- 典型访问方式:
file:///C:/your/path/index.html
nodejs path 模块
其实这个模块也从侧面反映出 require 是动态运行时使用的
javascript
const path = require("path");
path 是 Node.js 内置的一个核心模块,专门用来处理和转换文件路径。因为它内置于 Node.js,所以不需要额外安装,直接 require("path") 就可以使用。
为什么需要它? 不同操作系统(如 Windows、macOS、Linux)的路径分隔符是不同的(Windows 用 \,macOS/Linux 用 /)。如果手动拼接字符串(例如 "./output/"),代码在不同系统上可能会出错。path 模块提供的方法可以确保你的路径处理逻辑在所有平台上都能正确工作。
javascript
__dirname
__dirname 是 Node.js 环境中的一个全局变量 (不是 path 模块的一部分)。
它代表 当前正在执行的脚本文件所在的目录的绝对路径。
javascript
my-project/
├── webpack.config.js <-- 当前执行的文件
├── src/
│ └── index.js
└── package.json
在 my-project 目录下运行 Webpack 时
webpack.config.js 文件被执行。
在这个文件中,__dirname 的值就是 my-project 文件夹的绝对路径
javascript
path.resolve([...paths])
path.resolve() 是什么?
这是 path 模块最重要的方法之一。它的作用是:将一系列路径或路径片段解析为一个绝对路径。
- 工作方式:它会从右到左处理传入的路径参数,直到构造出一个绝对路径。如果到最左边还没构造出绝对路径,就会使用当前工作目录。
- 在本例中的作用:
path.resolve(__dirname, "output")- 接收到第一个参数
__dirname,它已经是一个绝对路径
- 接收到第一个参数