本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
Node.js是一个基于Chrome V8引擎的JavaScript运行时。
JS的服务端运行环境,用于构建工具webpack的环境依赖。
特点:单线程、异步编程。
应用场景:低运算、高I/O。
Current Node.js (/Users/javaedge/.nvm/versions/node/v16.20.2/bin/node) version is v16.20.2, please upgrade to 20.6.0 or higher for better compatibility.当前使用的 Node.js 版本(v16.20.2)低于某个工具、框架或项目所要求的最低版本(≥20.6.0)。因为它们使用了新语法(如顶层 await)、新 API(如 fetch 内置支持)或性能优化,这些在 Node 16 中不可用或不稳定。
安全与维护策略
你可能在运行某个 CLI 工具
如执行了:
npx create-react-app my-app
npm run dev
pnpm install而该工具内部检测到你的 Node 版本太旧,直接报错阻止继续,避免后续构建失败或运行时崩溃。
Nodejs的包管理工具。

node -v
v14.14.0
npm init+----------+ +-----------+ +-------------+
| npm init |---->| 输入参数 |---->| package.json |
+----------+ +-----------+ +-------------+设计思想:require anything
加载方式:各种loader插件
编译方式:commonjs模块-> function类型模块
官方文档:http://webpack.github.io/docs/。
sudo npm install -g webpack$ sudo npm install -g webpack
Password:
/usr/local/bin/webpack -> /usr/local/lib/node_modules/webpack/bin/webpack.js
+ webpack@5.16.0
added 79 packages from 124 contributors in 4.342s
$ npm install webpack@1.15.0 --save-dev
$ webpack -vBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。
使用默认配置进行一次性的构建(打包)。
默认行为:
./src/index.js./dist/main.js适用场景:快速打包,使用约定优于配置的默认设置。
✅ 相当于:
webpack --mode=production
生产环境打包(-p 是 --optimize-minimize --define process.env.NODE_ENV="production" 的简写)。
效果:
process.env.NODE_ENV = "production"(用于条件编译,如移除 React 开发警告)mode: 'production'Webpack 5 中,-p 仍然有效,但官方更推荐显式使用 --mode=production。
⚠️
实际上,webpack -p ≈webpack --mode=production
监听文件变化,自动重新打包。
行为:
entry 或其依赖的文件发生变化时,自动重新编译。输出:仍输出到 dist/ 目录(或配置指定位置)。
适用场景:开发时手动刷新页面查看效果(比 HMR 简单,但无热更新)。
🔁 类似于“持续构建”,但不启动开发服务器(不像
webpack serve或webpack-dev-server)。
指定自定义配置文件路径。
Webpack 默认会查找 webpack.config.js,所以这个命令其实和 webpack 效果一样。
但当你有多个配置文件时非常有用,如:
webpack --config webpack.prod.js # 生产配置
webpack --config webpack.dev.js # 开发配置配置文件可以是 .js、.ts、.mjs 等(需支持 Node.js 加载)。
📌 提示:你也可以用
-c作为--config的缩写:
webpack -c my.webpack.config.js命令 | 说明 |
|---|---|
| 生产构建(默认 mode=production) |
| 开发构建(不压缩,更快) |
| 启动开发服务器(带 HMR,需安装 |
| 监听文件变化并重新打包(无服务器) |
命令 | 等效含义 | 使用场景 |
|---|---|---|
|
| 最终打包上线 |
| 同上(旧式写法) | 兼容老脚本 |
| 监听 + 重新打包 | 开发时手动刷新 |
| 使用指定配置文件 | 多环境配置管理 |
💡 建议:在新项目中,优先使用
--mode显式指定模式,并用webpack serve替代--watch获得更好的开发体验。
webpack-dev-server作用:启动前端开发服务器
特色:可以在文件改变时,自动刷新浏览器
安装:
npm install webpack-dev-server一save-dev配置:
webpack-dev-server/client?http://localhost:8088使用:
webpack-dev-server --port 8088 --inlinewebpack-dev-server --contentbase -src --inline --hot(热加载启动命令)$ webpack-dev-server
# 静态文件根目录为 src(注意:-src 可能是笔误,应为 --content-base src)
--contentbase -src
# 将客户端脚本内联到页面中
--inline
# 启用热模块替换(HMR)
--hot
# 访问地址
http://localhost:8080/
webpack result is served from /
content is served from /Users/apple/WebstormProjects/sourcecode/05-03
Hash: 6b37863c2518ec609626
Version: webpack 1.13.2
Time: 1175ms
# 输出文件 文件大小:2.55 MB(未压缩) 构建时间
Asset Size Chunks Chunk Names
./src/bundle.js 2.55 MB 0 [emitted] main
chunk {0} ./src/bundle.js (main) 918 kB [rendered]// 核心构建工具
var webpack = require('webpack');
// 将 CSS 提取到独立文件中(已废弃,现代项目用 mini-css-extract-plugin)
var ExtractTextPlugin = require('extract-text-webpack-plugin');
// 自动生成 HTML 文件,并注入 <script> 和 <link> 标签
var HtmlWebpackPlugin = require('html-webpack-plugin');
// 环境变量配置, dev / online 通过命令行传参控制环境,如npm run build -- --WEBPACK_ENV=online
var WEBPACK_ENV = process.env.WEBPACK_ENV || 'dev';
// 获取 html-webpack-plugin 参数的方法 动态生成HTML配置函数
var getHtmlConfig = function(name, title){
return {
template : './view/' + name + '.html',
filename : './view/' + name + '.html',
favicon : './favicon.ico', // see!!!
title : title,
inject : true,
hash : true,
chunks : ['./common', name]
};
};
// webpack config
var config = {
entry: {
'common' : ['./src/page/common/index.js'],
'index' : ['./src/page/index/index.js'],
'list' : ['./src/page/list/index.js'],
'detail' : ['./src/page/detail/index.js'],
'cart' : ['./src/page/cart/index.js'],
'user-login' : ['./src/page/user-login/index.js'],
'user-register' : ['./src/page/user-register/index.js'],
'user-pass-reset' : ['./src/page/user-pass-reset/index.js'],
'user-center' : ['./src/page/user-center/index.js'],
'user-center-update': ['./src/page/user-center-update/index.js'],
'user-pass-update' : ['./src/page/user-pass-update/index.js'],
'result' : ['./src/page/result/index.js'],
'about' : ['./src/page/about/index.js']
},
output: {
path : __dirname + '/dist/',
publicPath : 'dev' === WEBPACK_ENV ? '/dist/' : '//s.shishusheng.com/mmall-fe/dist/',
filename : 'js/[name].js'
}
};src/view/layout/head-common.html:
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="keywords" content="二手书,电商">
<meta name="description" content="二手书电商平台">
<link rel="dns-prefetch" href="//cdn.bootcss.com">
<link rel="dns-prefetch" href="//s.javaedge.com">
<link rel="dns-prefetch" href="//img.javaedge.com">浏览器在加载页面时,提前解析域名的 DNS 记录,减少后续请求的延迟。
https://cdn.bootcss.com/jquery.js → 先查 DNS → 再建立 TCP 连接 → 下载资源dns-prefetch:提前解析 cdn.bootcss.com 的 IP 地址,当真正请求时跳过 DNS 查询步骤优化点 | 效果 |
|---|---|
减少 DNS 查找时间 | 提升首屏加载速度 |
改善用户体验 | 页面响应更快 |
适用于跨域资源 | 如 CDN、图片服务器等 |
<link rel="dns-prefetch" href="//cdn.bootcss.com">我将从 cdn.bootcss.com 加载 CSS/JS(如 Bootstrap、jQuery),现在就去解析它的 DNS。
实际应用中,这类域名通常是静态资源托管地址,提前解析能显著提升性能。
典型的 前端性能优化 + SEO 配置
类型 | 内容 | 作用 |
|---|---|---|
字符编码 |
| 避免乱码 |
浏览器兼容 |
| 强制 IE 使用最新模式 |
SEO |
| 提升搜索引擎可见性 |
性能优化 |
| 提前解析域名,加快资源加载 |
推荐实践:
dns-prefetch:对频繁使用的第三方域名(CDN、图片站)非常有用。description:简洁明了,突出核心价值。preconnect 替代 dns-prefetch<link rel="preconnect" href="//cdn.bootcss.com">接着执行 webpack 进行打包。
请求和响应
{
"status": 0, // 接口状态,0成功、1失败、10未登录
"data": { // 接口数据
"id": 2,
"name": "oppo R8"
}
}{
"status": 1,
"msg": "该商品已下架或删除"
}优点 | 说明 |
|---|---|
✅ 统一格式 | 所有接口都遵循相同结构,易于解析 |
✅ 易于判断 | 前端只需检查 |
✅ 可扩展 | 支持更多状态码(如 |
✅ 兼容性好 | 不依赖特定框架,适用于任何语言 |
// 前端处理逻辑示例(JavaScript)
fetch('/api/product/2')
.then(res => res.json())
.then(data => {
if (data.status === 0) {
console.log('商品名称:', data.data.name);
} else if (data.status === 1) {
alert(data.msg); // 弹出错误信息
} else if (data.status === 10) {
window.location.href = '/login'; // 跳转登录页
}
});+--------+ +--------+ +--------+ +----------+
| URL解析 |---->| DNS查询 |---->| 资源请求 |---->| 浏览器解析 |
+--------+ +--------+ +--------+ +----------+www.example.com)解析为 IP 地址。http:// www.javaedge.com:80 /get_data.do ?productld=1 #title
↑ ↑ ↑ ↑ ↑
协议 域名+端口 路径 参数 哈希
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="dns-prefetch" href="//cdn.bootcss.com">
<link rel="dns-prefetch" href="//s.javaedge.com">
<link rel="dns-prefetch" href="//img.javaedge.com">
<title></title>
</head>

用户端保存请求信息的机制。Cookie 是浏览器用来存储服务器发送的少量数据的一种机制。实现“状态保持”(Stateful)——HTTP 是无状态协议,Cookie 让服务器能识别用户身份(如登录状态、购物车)。
session_id=abc123 的 Cookie。格式示例:
Set-Cookie: session_id=abc123; user_id=456; expires=Wed, 01 Jan 2025 00:00:00 GMT; path=/; domain=.example.com多个键值对用 ; 分隔。
每个字段可以是:
session_id=abc123)expires, path, domain, secure, HttpOnly 等)Set-Cookie是服务器响应头中的字段,浏览器收到后会保存并自动附加到后续请求中。
实际存储位置:
Cookies 文件夹)。安全性提醒:
HttpOnly 和 Secure,可能被 XSS 攻击窃取。控制 Cookie 的作用范围,防止跨站访问。
指定哪些域名可访问此 Cookie,即cookie生效的域名。示例:
domain=.happy-mall.com → 可被 www.happy-mall.com、api.happy-mall.com 使用。
指定 URL 路径前缀。示例:path=/user → 只有 /user/* 路径下的请求才会携带该 Cookie。
默认行为:
domain 默认为当前域名。path 默认为当前路径。cookie名称
cookie生效的路径
cookie过期时间
用户端不可更改
浏览器执行此脚本即可查看 cookie:
> document.cookie
< "Hm_lvt_bc210cd22928076d28296716d9dfcf01=1526105745; Hm_lpv_t_bc210cd22928076d28296716d9dfcf01=1527049716"
自定义:

自定义生效:

修改 cookie:

生效:

删除 cookie:有效期设置为以前的时间即可或者设成0

已经不存在 sss1234 的 cookie:


登录后,发现新增 jssessionID 字段的 cookie,属于 http-only,用户端不可修改。发现并无此 cookie:

查看具体的 response 信息:

替代 cookie:
H5新特性,有域名限制,不存在作用域概念。在浏览器本地存储数据。
只有key-value:
key:字符串,作为存储的键(如 'name')value:必须是字符串类型。如果不是,会自动转换为字符串没有过期时间,浏览器关闭后不消失。
和localStorage极其相似,浏览器关闭后消失。
// 添加
window.localStorage.setItem('name', 'sss');
// 查看
window.localStorage.getItem('name');
// 删除
window.localStorage.removeItem('name');
浏览器存储位置:


