express 搭建前端静态服务器代码实操_express 静态服务器
express框架原理阐述:
Express框架的核心原理围绕中间件管道机制和路由分层设计构建,以下是其关键技术原理解析:
一、中间件管道机制(Middleware Pipeline)
1. 链式处理模型
- 执行逻辑:请求按中间件注册顺序流经处理栈,每个中间件通过
next()
控制权传递。 - 核心函数:中间件本质为
(req, res, next) => {}
函数,可修改请求/响应对象或终止流程。
2. 中间件类型
app.use(express.json())
router.get(\'/user\', auth)
(err, req, res, next)=>{}
express.static()
错误处理中间件需声明
err
为首参数,否则被识别为普通中间件。
二、路由系统原理
1. 分层路由设计
// 创建路由实例 const userRouter = express.Router(); userRouter.get(\'/profile\', (req, res) => {...}); // 挂载到应用 app.use(\'/api\', userRouter); // 访问路径:/api/profile
- 路由实例化:
Router()
创建独立路由对象,支持模块化拆分。 - 路径匹配:采用前缀匹配规则,如
app.use(\'/api\', router)
会拦截所有/api
开头的请求。
2. 路由匹配优先级
- 声明顺序敏感:按代码注册顺序依次匹配。
- 特殊路径规则:
app.get(\'/user/:id\')
动态参数捕获(:id
占位符)app.all(\'*\')
捕获所有未匹配路由(常用于404处理)
三、性能优化设计
-
非阻塞I/O模型
- 继承Node.js事件驱动架构,单线程处理高并发请求。
- 避免同步操作阻塞事件循环(如使用
fs.readFile
替代fs.readFileSync
)。
-
视图渲染优化
- 支持模板引擎(如EJS、Pug),通过
app.set(\'view engine\', \'ejs\')
配置。 - 服务端渲染(SSR)机制:
res.render(\'index\', {data})
合并数据与模板。
- 支持模板引擎(如EJS、Pug),通过
四、扩展性设计
-
模块化扩展
- 通过
app.use()
集成第三方中间件(如body-parser
解析POST数据)。 - 中间件仓库:Express Middleware提供官方认证模块。
- 通过
-
Hooks扩展点
- 前置钩子:在路由前执行的中间件(如请求日志)。
- 后置钩子:在路由后处理的中间件(如响应压缩)。
五、常见原理级问题
-
中间件执行中断
- 场景:忘记调用
next()
导致请求挂起。 - 方案:确保异步操作后调用
next()
(如数据库查询回调中)。
- 场景:忘记调用
-
路由冲突
- 场景:
/api/user
与/api/:id
冲突时,静态路由优先。 - 方案:调整注册顺序或使用更精确路径匹配。
- 场景:
设计哲学总结:Express通过轻量级中间件管道实现高扩展性,依托Node.js异步特性保障性能,其简洁的req/res
对象封装降低了HTTP处理复杂度。
express搭建静态服务器代码实操:
1.先在电脑中创建一个文件夹,命名为\"express-static-server\",创建好后通过vscode打开该文件夹,在vscode中打开命令行窗口,输入“npm init -y”创建package.json文件,创建完成后执行“npm i express nodemon”安装本次搭建服务器所需的npm包依赖资源。
2.通过在命令行窗口执行\"npm create vite@latest --template vue\"命令创建一个vue模板工程,创建好后更改vue工程中的vite.config.js,修改配置文件为如下内容,重点变更的内容以及其含义已在文件中以注释标明
import { defineConfig } from \'vite\'import vue from \'@vitejs/plugin-vue\'// https://vite.dev/config/export default defineConfig({ plugins: [vue()], build: { emptyOutDir: true, // 每次构建时清空输出目录文件夹 outDir: \'../public\', // 将打包资源输出到当前vscode打开的根文件夹目录下,并将输出的文件夹命名为public assetsDir: \'static\', // 打包后的所有资源都会放置在这个目录下,index.html除外,index.html和该文件夹平级放置 rollupOptions:{ output:{ entryFileNames: \'static/js/[name]-[hash].js\', chunkFileNames: \'static/js/[name]-[hash].js\', assetFileNames: \'static/[ext]/[name]-[hash].[ext]\' } } }})
3.修改好vue工程中的vite.config.js后需要在命令行中执行\"cd vue\"进入vue工程,执行\"npm i\"下载工程依赖的资源。依赖安装完成后执行“npm run build”进行打包,打包后将会看到在vscode打开的当前文件夹目录下生成了public文件夹,vue工程打包后的所有资源都在此文件内。
4.在当前vscode打开的文件夹的根目录下新建server.js,这个是用来启动静态资源服务器的js文件,内容如下:
const express = require(\'express\');const path = require(\'path\');const app = express();const port = 3000;/** * nodejs中的path模块提供操作文件路径的方法,path.join()方法可以拼接路径, * __dirname是当前server.js脚本所在的目录,拼接后形成绝对地址方便查找静态资源路径 * path.join(__dirname, \'public\') */console.log(\'拼接路径为::\', path.join(__dirname, \'public\'));// 设置服务器静态资源所在文件夹app.use(express.static(path.join(__dirname, \'public\')));// 设置域名默认路径对应index.html首页资源app.get(\'/\', (req, res) => { res.sendFile(path.join(__dirname, \'public/index.html\'));})// 启动服务器app.listen(port, () => { console.log(`静态资源服务器运行在localhost:${port}`);})
5.新建并写好server.js文件内容,在命令行中输入\"cd ../\"回到当前vscode打开的跟文件夹目录下,执行命令\"npx nodemon server.js\"启动nodejs服务器,可以在命令行窗口中看到“静态资源服务器运行在localhost:3000”即代表服务器已成功启动,打开浏览器,在浏览器中输入“localhost:3000”即可访问到打包后的vue工程首页页面了。其他的打包后的静态资源文件(例如css、js文件)的访问也可以通过在浏览器中输入url的形式去直接访问,访问路径如下:“http://localhost:3000/static/css/{css文件名}”,访问路径中的“{css文件名}”需要替换为打包后public文件夹中对应文件的真实文件名(需要带.css或者.js后缀),因为每次打包后的文件名是通过vite.config.js中的如下规则配置的,里面的hash每次打包时如果文件内容改变,则hash会是不同的值,所以需要在直接访问静态资源文件时每次都要去复制最新的文件名去访问才行,当然也可以不在规则里面加hash,但是真实的生产环境里面都是需要加上的,这和我们以后要讲的浏览器缓存也会有关系。
rollupOptions:{ output:{ entryFileNames: \'static/js/[name]-[hash].js\', chunkFileNames: \'static/js/[name]-[hash].js\', assetFileNames: \'static/[ext]/[name]-[hash].[ext]\' } }
细节补充:npx nodemon server.js 中的npx的作用
npx 和 npm 的关系大白话总结:
-
npm 是“仓库管理员”
- 负责下载、安装和管理包(比如
npm install lodash
)。 - 本地安装的包默认藏在
node_modules
里,想用它的命令得手动找路径(比如./node_modules/.bin/vite
)。
- 负责下载、安装和管理包(比如
-
npx 是“临时工跑腿”
- 不用安装:临时用个工具(比如
npx create-react-app
),用完就扔,不占硬盘。 - 自动找本地命令:省去输入
./node_modules/.bin/
的麻烦(直接npx vite
)。 - 尝鲜神器:随便试不同版本的包(比如
npx node@14 app.js
)。
- 不用安装:临时用个工具(比如
一句话:
npm
管装包,npx
管跑包。想长期用就npm install
,想临时用就npx
。
爆肝不易,若觉得这篇文章对您有帮助,可以通过文章底部的\"打赏功能\"请作者喝杯咖啡☕继续肝下一篇!