이 기사의 내용은 Node.js의 정적 리소스 서버 구현(코드 포함)에 대한 내용입니다. 필요한 친구가 참고할 수 있기를 바랍니다.
이 글에서는 Node.js 초보자에게 도움이 되길 바라며 간단한 정적 리소스 서버 예제 프로젝트를 소개합니다. 이 프로젝트에는 http, fs, url, path, zlib, process, child_process 및 기타 모듈이 포함되어 있으며 일반적으로 사용되는 수많은 API를 포함합니다. 또한 http 프로토콜, gzip 압축 최적화 등을 기반으로 한 캐싱 전략도 포함됩니다. 이를 npm에 게시하고 전 세계적으로 설치하고 사용할 수 있는 작은 도구로 만들 것입니다. 참새는 작지만 내장이 다 들어있다고 생각하면 좀 설레지 않나요? 더 이상 고민하지 말고 속도를 높여 보겠습니다.
기사에 나온 소스코드 주소는 최종 부록에 있습니다.
프로젝트 효과를 미리 경험할 수 있습니다:
설치: npm i -g here11
임의의 폴더 주소에 명령을 입력하세요: here
const http = require("http"); const url = require("url"); const fs = require("fs"); const path = require("path"); const item = (name, parentPath) => { let path = parentPath = `${parentPath}/${name}`.slice(1); return `<p><a>${name}</a></p>`; } const list = (arr, parentPath) => { return arr.map(name => item(name, parentPath)).join(""); } const server = http.createServer((req, res) => { let _path = url.parse(req.url).pathname;//去掉search let parentPath = _path; _path = path.join(__dirname, _path); try { //拿到路径所对应的文件描述对象 let stats = fs.statSync(_path); if (stats.isFile()) { //是文件,返回文件内容 let file = fs.readFileSync(_path); res.end(file); } else if (stats.isDirectory()) { //是目录,返回目录列表,让用户可以继续点击 let dirArray = fs.readdirSync(_path); res.end(list(dirArray, parentPath)); } else { res.end(); } } catch (err) { res.writeHead(404, "Not Found"); res.end(); } }); const port = 2234; const hostname = "127.0.0.1"; server.listen(port, hostname, () => { console.log(`server is running on http://${hostname}:${port}`); });
if (stats.isFile()) { //是文件,返回文件内容 //在createServer时传入的回调函数被添加到了"request"事件上,回调函数的两个形参req和res //分别为http.IncomingMessage对象和http.ServerResponse对象 //并且它们都实现了流接口 let readStream = fs.createReadStream(_path); readStream.pipe(res); }
const zlib = require("zlib"); if (stats.isFile()) { //是文件,返回文件内容 res.setHeader("content-encoding", "gzip"); const gzip = zlib.createGzip(); let readStream = fs.createReadStream(_path); readStream.pipe(gzip).pipe(res); }
if (stats.isFile()) { //是文件,返回文件内容 //增加判断文件是否有改动,没有改动返回304的逻辑 //从请求头获取modified时间 let IfModifiedSince = req.headers["if-modified-since"]; //获取文件的修改日期——时间戳格式 let mtime = stats.mtime; //如果服务器上的文件修改时间小于等于请求头携带的修改时间,则认定文件没有变化 if (IfModifiedSince && mtime <p>这样一套缓存策略在现代前端项目体系下还是比较合适的,尤其是对于spa应用来讲。我们希望index.html能够保证每次向服务器验证是否有更新,而其余的文件统一本地缓存一个月(自己定);通过webpack打包或其他工程化方式构建之后,js、css内容如果发生变化,文件名相应更新,index.html插入的manifest(或script链接、link链接等)清单会更新,保证用户能够实时得到最新的资源。</p><p>当然,缓存之路千万条,适合业务才重要,大家可以灵活制定。</p><h4>4. 命令行参数</h4><p>作为一个在命令行执行的工具,怎么能不象征性的支持几个参数呢?</p><pre class="brush:php;toolbar:false">const config = { //从命令行中获取端口号,如果未设置采用默认 port: process.argv[2] || 2234, hostname: "127.0.0.1" } server.listen(config.port, config.hostname, () => { console.log(`server is running on http://${config.hostname}:${config.port}`); });
这里就简单的举个栗子啦,大家可以自由发挥!
虽然没太大卵用,但还是要加。我就是要让你们知道,我加完之后什么样,你们就是什么样 :-( duang~
const exec = require("child_process").exec; server.listen(config.port, config.hostname, () => { console.log(`server is running on http://${config.hostname}:${config.port}`); exec(`open http://${config.hostname}:${config.port}`); });
用process.cwd()代替__dirname。
我们最终要做成一个全局并且可以在任意目录下调用的命令,所以拼接path的代码修改如下:
//__dirname是当前文件的目录地址,process.cwd()返回的是脚本执行的路径 _path = path.join(process.cwd(), _path);
基本上我们的代码都写完了,可以考虑发布了!(不发布到npm上何以显示逼格?)
得到一个配置类似下面所示的json文件:
{ "name": "here11", "version": "0.0.13", "private": false, "description": "a node static assets server", "bin": { "here": "./bin/index.js" }, "repository": { "type": "git", "url": "https://github.com/gww666/here.git" }, "scripts": { "test": "node bin/index.js" }, "keywords": [ "node" ], "author": "gw666", "license": "ISC" }
其中bin和private较为重要,其余的按照自己的项目情况填写。
bin这个配置代表的是npm i -g xxx之后,我们运行here命令所执行的文件,“here”这个名字可以随意起。
在index.js文件的开头加上:#!/usr/bin/env node
否则linux上运行会报错。
勉强贴一手命令,还不清楚自行百度:
没有账号的先添加一个,执行:
npm adduser
然后依次填入
Username: your name
Password: your password
Email: yourmail
npm会给你发一封验证邮件,记得点一下,不然会发布失败。
执行登录命令:
npm login
执行发布命令:
npm publish
发布的时候记得把项目名字、版本号、作者、仓库啥的改一下,别填成我的。
还有readme文件写一下,好歹告诉别人咋用,基本上和文首所说的用法是一样的。
好了,齐活。
还等啥啊,赶快把npm i -g xxx 这行命令发给你的小伙伴啊。什么?你没有小伙伴?告辞!
附
本文项目源码地址:https://github.com/gww666/here
위 내용은 Node.js 정적 리소스 서버 구현(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!