读过这篇文章《用Node.js吭哧吭哧撸一个静止主页》的同学必定晓得,前段时间我搭了一个静止页面。当初我有个想法就是把它用Docker打包镜像推送到Docker官网仓库,像《前端切图仔入门Docker,三分钟上线本人的博客平台》文章中搭建博客零碎一样,提供一个静止主页的Docker镜像,不便有想法的同学三分钟部署本人的静止主页。
什么是动态文件服务器
作为前端搬砖工,肯定接触过动态文件服务器。动态文件服务器它的工作是将动态文件通过http/https传输给客户端。动态文件又是什么?动态文件是指内容不须要动静生成的文件,如:图片、CSS文件、JS文件等等文件。咱们罕用的动态文件服务器有webpack-dev-server
这也是为什么咱们能在本地开发环境能够通过链接拜访页面的起因,还有就是Nginx
,个别线上环境应用它,因为它性能更加高效、稳固。
静止主页简略,齐全没必要在Docker打包时再下载Nginx镜像打包进去,间接用Node.js实现动态文件服务器的性能即可。
性能介绍
我须要的动态服务器只须要一个性能:
- 当用户申请的内容是文件时,返回文件内容
我的项目动态文件构造是这样的:
client
├─src
│ └─js文件
└─index.html
具体文件构造请拜访仓库地址。
启动我的项目
拉取我的项目:
git clone https://github.com/CatsAndMice/keep
下载依赖:
npm i
创立.env
文件,写入Keep帐号、明码:
MOBILE="Keep帐号"
PASSWORD="Keep明码"
最初,执行npm run serve
,我的项目即可启动。当咱们间接拜访
http://localhost:3000就能拜访index.html
文件,index.html
文件内容如下:
代码实现
依据上文的需要形容,咱们先用流程图
来设计一下咱们的逻辑如何实现:
动态文件服务器的实现思路还是很简略的:先判断资源存不存在
,不存在就间接报错,资源存在的话依据资源的类型返回对应的后果给客户端
就能够了。
Express实现
静止主页非常简单,很多动态JS、图片文件已搁置在云端,index.html
文件只援用了一份本地的JS文件。不论是什么申请形式,当有申请门路存在/src
时都会走app.all('/src/*',()⇒{...})
。
不同的动态文件对应不同的申请头Content-Type
值,如:JS文件对应application/javascript
、CSS文件对应text/css
等等,点Content-Type类型能够查看还有哪些值。
Content-Type
标头目标是为了通知客户端理论返回的内容的内容类型,以便客户端根据文件类型进行解析。
const express = require('express');
const { getTotal, getFirstPageRecentUpdates } = require("./src")
const { to } = require('await-to-js');
const path = require('path');
const fs = require('node:fs')
const app = express();
const port = 3000;
//获取client文件夹的绝对路径
const htmlPath = path.join(__dirname, './client');
//申请头Content-Type值
const contentType = {
'.js': 'application/javascript;charset=utf8'
}
//省略其余逻辑
//门路存在"/src",执行下列代码块逻辑
app.all('/src/*', (req, res) => {
const { url } = req;
const filePath = htmlPath + url;
//判断文件是否存在
if (fs.existsSync(filePath)) {
const extname = path.extname(filePath);
res.setHeader('Content-Type', contentType[extname]);
const content = fs.readFileSync(filePath);
res.send(content);
return
}
//不存在,浏览器状态码返回404
res.sendStatus('404')
})
//拜访http://localhost:3000时,执行这部分逻辑返回index.html内容
app.get('/', async (req, res) => {
res.setHeader('Content-Type', 'text/html;charset=utf8');
const readHtmlPath = htmlPath + '/index.html'
const html = fs.readFileSync(readHtmlPath)
res.send(html)
})
app.listen(port, () => {
console.log('服务已开启');
})
写一个能用的动态文件服务器还是简略的,这里依赖Express框架不便得多。原生模块实现有趣味的同学能够去写写。
最初
文章中介绍实现了一个最简略能用的动态文件服务器
,如果开发一个欠缺的动态文件服务器还有十分多的性能要思考,如:动态文件缓存、压缩等等。
另外还有一个实在案例给大家实际,有趣味的同学clone
下来本人玩玩。
如果我的文章对你有帮忙,您的👍就是对我的最大反对^_^。
欢送围观朋友圈、加我微信拉您退出人类高质量前端交换群
发表回复