Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine eingehende Analyse der koa-statischen Middleware in NodeJS

青灯夜游
Freigeben: 2021-03-08 10:05:24
nach vorne
2320 Leute haben es durchsucht

In diesem Artikel wird Ihnen die statische Datei-Middleware koa-static in node vorgestellt. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Eine eingehende Analyse der koa-statischen Middleware in NodeJS

Verwandte Empfehlungen: „nodejs-Tutorial

Erläutern Sie die Verwendung von koa-static

Wenn Sie in app.js das aktuelle Verzeichnis als Hosting-Verzeichnis angeben möchten, gehen wir normalerweise wie folgt vor:

const static=require('koa-static')
const Koa=require('koa')
const app=new Koa()

app.use(static('.'))
app.listen(8081)
Nach dem Login kopieren

koa -static ist die am häufigsten verwendete und relativ ausgereifte statische Webhosting-Dienst-Middleware in Koa (Knoten-Framework). Sie wird häufig in Koa für statische Ressourcen mit externen Links (z. B. CSS-Dateien) verwendet:

//下载
npm install koa-static --save
Nach dem Login kopieren
//引入
const server=require('koa-static')
Nach dem Login kopieren
//使用
app.use(server('static'))//或:app.use(server(__dirname+'/static'))
Nach dem Login kopieren

Kurz gesagt, es muss etwas auf dem Server sein. Es ist der statische Vorlagenpfad (relativ)

Dann können wir die xxx.css-Datei im CSS-Ordner im statischen Verzeichnis wie folgt verwenden:

<link rel="stylesheet" href="css/xxx.css" />
Nach dem Login kopieren

Ist Ist das so einfach? Was ist also sein Prinzip?

Stellen Sie den „Content-Type“-Wert des Anforderungsheaders entsprechend dem Dateisuffixnamen ein, damit er mit der Browserdarstellung übereinstimmt!

Nehmen wir die oben erwähnte Statik:

  • Suchen Sie nach static/css/xxx.css, um zu sehen, ob sie existiert. static/css/xxx.css 是否存在

  • (若存在)设置 Content-Type: text/css;charset=utf-8;

  • 通过response返回给浏览器

前面说了koa-static作用是 ☞静态文件托管☜ ,那肯定不只是对于CSS、JavaScript这类资源文件。

事实上,对于图片,koa-static同样可以用于设置 图片缓存 !就像这样

const server=require(&#39;koa-static&#39;)
const path=require(&#39;path&#39;)   //path模块:设置路径信息

const staticPath=path.resolve(__dirname,&#39;static&#39;)
const staticServer=server(staticPath,{
	setHeadears:(res,path,stats)=>{
		if(path.indexOf(/[jpg|png|gif|jpeg]/)>-1){
			res.setHeader(&#39;Cache-Control&#39;,[&#39;private&#39;,&#39;max-age=60&#39;])
		}
	}
})
app.use(staticServer);
Nach dem Login kopieren

——如果对应路径中是jpg/GIF/png/jpeg格式的图片,那么就将其缓存60s。


我们都知道,在express(node框架)中有一个关于静态服务的“便捷方式”:

app.use(&#39;/teacher&#39;,express.static(&#39;/public&#39;))
Nach dem Login kopieren

它可以指定静态服务的“请求前缀” —— 就是指定加载相对于哪个url的静态资源。

很明显,这是非常实用的。我们突然想到,本文上面我们所说的koa-static都是相对于“全局 ”作用的?

如何在koa中实现这个功能呢?koa为开发者提供了另一个(辅助)模块 —— koa-mount

const Koa=require(&#39;koa&#39;)
const server=require(&#39;koa-static&#39;)
const mount=require(&#39;koa-mount&#39;)

const app=new Koa()
app.use(mount(&#39;/teacher&#39;,server(&#39;/public&#39;)))
Nach dem Login kopieren

koa-mount是一个将中间件挂载到指定路径的Koa中间件。它可以挂载任意Koa中间件!
前面说过,koa-static是一个中间件,所以koa-mount可以和koa-static结合,以实现和express一样的静态服务请求前缀的功能。


static原理探究

学习了上面神奇的使用方式,你有没有想过它是怎么实现的?
通过 npm info koa-static ,你会发现 koa-static 依赖两个模块,分别是 debug 和 koa-send 。
找到 koa-static 源码的index文件,其核心实现如下:

const send = require(&#39;koa-send&#39;);
//...
function serve (root, opts) {
	//...
	return async function serve (ctx, next) {
		await next()
		if (ctx.method !== &#39;HEAD&#39; && ctx.method !== &#39;GET&#39;) return
		if (ctx.body !== null && ctx.status !== 404) return // eslint-disable-line
		try {
			await send(ctx, ctx.path, opts)
		}catch (err) {
			if (err.status !== 404) {
				throw err
			}
		}
	}
}
Nach dem Login kopieren

而经过这段代码,我们发现其中实现核心是 send() 方法,而这是由模块 koa-send 提供的!

找到koa-send的源码,发现其核心实现原理也是很简单的:

if (!ctx.type) ctx.type = type(path, encodingExt)
ctx.body = fs.createReadStream(path)
Nach dem Login kopieren

其中type方法是根据文件后缀来设置 Content-Type !很实用,但是我们这里更要关注的是另一个比较有趣的事 —— koa-send的原理:

  • 设置 Content-Type ,可通过文件后缀进行设置;

  • 以Stream形式为ctx.body赋值

为什么说它有趣呢?
除了它竟然也是以设置content-type为目标外,stream流的方式一直受到业界大拿们的推崇:因为它比 fs.readFileSync

(falls vorhanden) legen Sie Content- fest. Typ: text /css;charset=utf-8;

wird durch Antwort an den Browser zurückgegeben

    Wie bereits erwähnt, ist die Funktion von koa-static ☞statisches Datei-Hosting☜ definitiv nicht nur für CSS- und JavaScript-Klassenressourcendateien.
  • Tatsächlich kann koa-static für Bilder auch zum Einrichten des

    Bildcaches
  • verwendet werden! Einfach so
  • app.use(function(ctx){
    	const fs=require(&#39;fs&#39;)
    	const result=fs.readFileSync(&#39;xxx&#39;)
    	ctx.type=type(result, encodingExt)
    	ctx.body=result
    })
    Nach dem Login kopieren

    - Wenn der entsprechende Pfad ein Bild im JPG/GIF/PNG/JPEG-Format ist, wird es 60 Sekunden lang zwischengespeichert.

    Wir alle wissen, dass es einen „bequemen Weg“ für statische Dienste im Express (Knoten-Framework) gibt:
    rrreee

    Es kann das „Anforderungspräfix“ des statischen Dienstes angeben, also angeben, welche URL geladen werden soll die statische Ressource relativ zu . Das ist natürlich sehr praktisch. Wir dachten plötzlich, dass die Koa-Statik, die wir oben in diesem Artikel erwähnt haben, im Verhältnis zu „
    global
    “ funktioniert?

    Wie implementiert man diese Funktion in Koa? koa bietet ein weiteres (Hilfs-)Modul für Entwickler –

    koa-mount

    rrreeekoa-mount ist eine Koa-Middleware, die Middleware in einem angegebenen Pfad bereitstellt. Es kann jede Koa-Middleware montieren!

    Wie bereits erwähnt, handelt es sich bei koa-static um eine Middleware. Daher kann koa-mount mit koa-static kombiniert werden, um dieselbe statische Dienstanforderungspräfixfunktion wie Express zu erreichen. 🎜🎜🎜🎜Untersuchung statischer Prinzipien🎜🎜Haben Sie nach dem Erlernen der oben genannten magischen Verwendung jemals darüber nachgedacht, wie sie implementiert wird? 🎜 Über npm info koa-static werden Sie feststellen, dass koa-static von zwei Modulen abhängt, nämlich Debug und koa-send. 🎜 Suchen Sie die Indexdatei des koa-static-Quellcodes. Die Kernimplementierung lautet wie folgt: 🎜rrreee🎜 Nach diesem Code haben wir festgestellt, dass die Kernimplementierung die bereitgestellte Methode send() ist durch das Modul 🎜koa-send🎜 bereitgestellt! 🎜🎜Suchen Sie den Quellcode von koa-send und stellen Sie fest, dass das Kernimplementierungsprinzip ebenfalls sehr einfach ist: 🎜rrreee🎜Die Typmethode wird entsprechend dem Dateisuffix 🎜Content-Type🎜 festgelegt! Sehr praktisch, aber worauf wir hier mehr achten sollten, ist eine andere interessante Sache – das Prinzip von koa-send: 🎜🎜🎜🎜Set Content-Type, das über das Dateisuffix 🎜🎜🎜🎜 in Stream-Form festgelegt werden kann ctx .body-Zuweisung🎜🎜🎜🎜Warum ist es interessant? 🎜 Neben der Tatsache, dass es auch auf die Festlegung des Inhaltstyps abzielt, wurde die Stream-Methode von Branchenexperten immer gelobt: weil sie effizienter ist als fs.readFileSync! 🎜🎜Vergleichen wir den folgenden Code mit dem Quellcode von koa-send oben: 🎜rrreee🎜🎜Koa-Rezension🎜🎜Tatsächlich ist das Funktionsprinzip von ctx.body in Koa tatsächlich das gleiche wie bei koa-static, koa- Die in diesem Artikel erwähnte Sende-Middleware ist ähnlich: 🎜Verarbeiten Sie unterschiedliche Inhaltstypen entsprechend dem Zuweisungstyp.🎜🎜🎜🎜🎜Stellen Sie den entsprechenden Inhaltstyp entsprechend dem Körpertyp ein zum Inhaltstyp, um die Daten an den Browser zu übertragen 🎜🎜🎜🎜🎜Über 🎜Inhaltstypwert🎜: 🎜 Zeichenfolge – unterteilt in zwei Typen (verschieden): „text/html“ und „text/plain“ 🎜 Puffer-/Stream-Typ; 🎜 Wenn es sich nicht um einen der oben genannten Typen handelt, sollte es ein JSON-Objekt sein🎜 (Der Quellcode verwendet typeof, um seinen Typ zu bestimmen. Diese Technik ist sehr praktisch! 🎜🎜🎜Für weitere Programmierkenntnisse , besuchen Sie bitte: 🎜Programmiervideo🎜!!🎜

    Das obige ist der detaillierte Inhalt vonEine eingehende Analyse der koa-statischen Middleware in NodeJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!