목차
step1 새 프로젝트 만들기
4. 命令行参数
5. 自动打开浏览器
6. process.cwd()
step3 发布
step3.1 package.json
step3.2 声明脚本执行类型
step3.3 注册npm账号
step3.4
웹 프론트엔드 JS 튜토리얼 Node.js 정적 리소스 서버 구현(코드 포함)

Node.js 정적 리소스 서버 구현(코드 포함)

Mar 08, 2019 pm 05:14 PM
javascript node.js

이 기사의 내용은 Node.js의 정적 리소스 서버 구현(코드 포함)에 대한 내용입니다. 필요한 친구가 참고할 수 있기를 바랍니다.

이 글에서는 Node.js 초보자에게 도움이 되길 바라며 간단한 정적 리소스 서버 예제 프로젝트를 소개합니다. 이 프로젝트에는 http, fs, url, path, zlib, process, child_process 및 기타 모듈이 포함되어 있으며 일반적으로 사용되는 수많은 API를 포함합니다. 또한 http 프로토콜, gzip 압축 최적화 등을 기반으로 한 캐싱 전략도 포함됩니다. 이를 npm에 게시하고 전 세계적으로 설치하고 사용할 수 있는 작은 도구로 만들 것입니다. 참새는 작지만 내장이 다 들어있다고 생각하면 좀 설레지 않나요? 더 이상 고민하지 말고 속도를 높여 보겠습니다.

기사에 나온 소스코드 주소는 최종 부록에 있습니다.
프로젝트 효과를 미리 경험할 수 있습니다:
설치: npm i -g here11
임의의 폴더 주소에 명령을 입력하세요: here

step1 새 프로젝트 만들기

#🎜 🎜#npm에 게시하고 싶기 때문에 먼저 국제 관행을 따르고 npm init, 가자! 명령줄에서 Enter 키를 계속 누를 수 있으며 일부 구성은 최종 게시 단계에서 자세히 설명됩니다.

디렉터리 구조는 다음과 같습니다.

Node.js 정적 리소스 서버 구현(코드 포함)

bin 폴더에는 실행 코드가 저장되며, 웹은 다음과 같은 폴더로 사용됩니다. 테스트 폴더.

step2 code

step2.1 Prototype

정적 리소스 서버는 일반인의 용어로 "http: //도메인 이름/ test/index.html", 서버는 루트 디렉터리의 해당 폴더에서 index.html을 찾아 파일 내용을 읽어 브라우저에 반환하고, 브라우저는 이를 사용자에게 렌더링합니다.

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}`);
});
로그인 후 복사
위 코드는 핵심 기능이 구현된 코드입니다. 로컬로 실행하면 파일 이름을 클릭하여 해당 웹 페이지를 탐색할 수 있습니다. , 사진, 텍스트 라.

step2.2 최적화

기능이 구현되었지만 실용성을 높이고 더 많은 API(가장 기술)를 배우기 위해 일부 측면에서 최적화할 수 있습니다.

1.stream

파일을 읽고 브라우저에 반환하는 현재 작업은 파일을 한 번 읽고 readFile을 통해 한 번 반환하는 것입니다. 함수이지만 더 나은 방법이 있습니다. 스트림을 사용하여 IO 작업을 수행하는 것입니다. 스트림은 node.js만의 고유한 개념이 아니라 운영 체제의 가장 기본적인 동작 형태이므로 이론적으로 모든 서버 측 언어가 스트림 API를 구현합니다.

스트림을 사용하는 것이 더 좋은 방법인 이유는 무엇인가요? 대용량 파일을 한번에 읽고 운영하는 것은 메모리와 네트워크를 소모하기 때문에 특히 스트림의 도움으로 사용자 방문 수가 상대적으로 많은 경우 데이터가 비트 단위로 흐르고 운영될 수 있어 성능이 향상됩니다. 코드 수정은 다음과 같습니다:

if (stats.isFile()) {
    //是文件,返回文件内容
    //在createServer时传入的回调函数被添加到了"request"事件上,回调函数的两个形参req和res
    //分别为http.IncomingMessage对象和http.ServerResponse对象
    //并且它们都实现了流接口
    let readStream = fs.createReadStream(_path);
    readStream.pipe(res);
}
로그인 후 복사
코딩 구현은 매우 간단합니다. 파일 내용을 반환해야 할 때 읽을 수 있는 스트림을 생성하고 이를 res 객체로 보냅니다.

2.gzip 압축

gzip 압축으로 인한 성능(사용자 액세스 경험) 개선은 특히 gzip 압축을 사용하는 인기 있는 스파 애플리케이션 시대에 매우 분명합니다. , js, css 등 파일 리소스의 크기를 대폭 줄이고 사용자 액세스 속도를 향상시킬 수 있습니다. 정적 리소스 서버로서 당연히 이 기능을 추가해야 합니다.

노드에는 압축 관련 API를 많이 제공하는 zlib 모듈이 있습니다. 우리는 이를 사용하여 다음을 구현합니다.

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);
}
로그인 후 복사
스트림 사용 경험을 바탕으로 살펴보기 이 코드는 이해하기 훨씬 쉽습니다. 파일 스트림을 먼저 gzip 개체로 보낸 다음 res 개체로 보냅니다. 또한, gzip 압축을 사용할 때 한 가지 주의할 점은 응답 헤더의 콘텐츠 인코딩을 gzip으로 설정해야 한다는 것입니다. 그렇지 않으면 브라우저에 잘못된 문자가 많이 표시됩니다.

3. http 캐시

캐싱은 잘 사용하면 사용자 경험을 향상시키고 잘못 사용하면 서버 부담을 줄일 수 있습니다. 당신은 온갖 이상한 문제에 직면하게 될 것입니다. 일반적으로 브라우저 http 캐시는 강력한 캐시(비검증 캐시)와 협상 캐시(검증 캐시)로 구분됩니다.

강력캐싱이란 무엇인가요? 강력한 캐싱은 캐시 제어(cache-control)와 만료(expired)라는 두 가지 헤더 필드로 제어됩니다. 예를 들어, 우리는 캐시 제어의 응답 헤더를 설정합니다: max-age=31536000, 이는 이 리소스의 캐시 기간이 1년임을 브라우저에 알려줍니다. 1년 이내에는 서버에 요청을 보낼 필요가 없습니다. 리소스는 캐시에서 직접 읽혀집니다. No -cache), 서버에 요청을 보내고 리소스의 유효성을 확인한 다음 캐시에서 읽을지 아니면 새 리소스를 반환할지 결정합니다.

위 개념을 사용하여 캐싱 전략을 공식화할 수 있습니다.

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 id="命令行参数">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}`);
});
로그인 후 복사

这里就简单的举个栗子啦,大家可以自由发挥!

5. 自动打开浏览器

虽然没太大卵用,但还是要加。我就是要让你们知道,我加完之后什么样,你们就是什么样 :-( 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}`);
});
로그인 후 복사

6. process.cwd()

用process.cwd()代替__dirname。
我们最终要做成一个全局并且可以在任意目录下调用的命令,所以拼接path的代码修改如下:

//__dirname是当前文件的目录地址,process.cwd()返回的是脚本执行的路径
_path = path.join(process.cwd(), _path);
로그인 후 복사

step3 发布

基本上我们的代码都写完了,可以考虑发布了!(不发布到npm上何以显示逼格?)

step3.1 package.json

得到一个配置类似下面所示的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”这个名字可以随意起。

step3.2 声明脚本执行类型

在index.js文件的开头加上:#!/usr/bin/env node
否则linux上运行会报错。

step3.3 注册npm账号

勉强贴一手命令,还不清楚自行百度:

没有账号的先添加一个,执行:
npm adduser

然后依次填入
Username: your name
Password: your password
Email: yourmail

npm会给你发一封验证邮件,记得点一下,不然会发布失败。

执行登录命令:
npm login

执行发布命令:
npm publish

发布的时候记得把项目名字、版本号、作者、仓库啥的改一下,别填成我的。
还有readme文件写一下,好歹告诉别人咋用,基本上和文首所说的用法是一样的。

好了,齐活。

step3.4

还等啥啊,赶快把npm i -g xxx 这行命令发给你的小伙伴啊。什么?你没有小伙伴?告辞!

本文项目源码地址:https://github.com/gww666/here

위 내용은 Node.js 정적 리소스 서버 구현(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 Dec 17, 2023 pm 02:54 PM

WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 Dec 17, 2023 am 09:39 AM

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 Dec 17, 2023 pm 12:09 PM

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

자바스크립트에서 insertBefore를 사용하는 방법 자바스크립트에서 insertBefore를 사용하는 방법 Nov 24, 2023 am 11:56 AM

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 Jan 05, 2024 pm 01:37 PM

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

See all articles