Express细节探究(1)——app.use(express.static)

express相信是不少人用nodejs搭建服务器的首选框架,相关教程有不少,也教会了你们来如何使用。若是你想更深的了解他的细节,不妨和我一块儿来研究一下。javascript

先来看一个每一个人都用到的方法app.use(express.static(__dirname+'/public'));php

你确定在你的app文件中这么用过它:css

  app.use(express.static(__dirname + '/public'));//设置静态文件目录

正如注释中写的那样,这句话的意思是,将静态文件目录设置为项目根目录+/public,固然你也多是这么写的:html

app.use(express.static(path.join(__dirname, 'public')));//和上面是同样的

运用path模块的join方法效果和前面是等价的,注意这里要引入path模块。前端

你有没有产生过疑问,为何这句话可以帮咱们设置静态文件目录呢?他到底作了些什么呢?java

为了照顾初学者,咱们不妨先从最基本的静态资源文件提及,什么是静态资源文件呢?node

静态资源文件通俗的能够理解成对于不一样的用户来讲,内容都不会变化的文件。好比不论是张三李四仍是王五访问百度,他们所接收到的看到的图片、css文件和前端javascript文件都是同样的,咱们称这类文件为静态资源文件。express

那么响应的,对于不一样用户作出不一样反应的就是动态文件了,张三李四王五登陆百度,百度会分别对他们显示"你好张三"、"你好李四"、"你好王五",那么负责这么动态逻辑的文件就是动态文件了,根据你是用的技术不一样,动态文件多是.jsp文件、php文件或者咱们node.js的服务器端js文件。服务器

那么app.use()方法又干了什么事情呢,咱们先来看看官方API怎么说的:app

大意是说,app.use是用来给path注册中间函数的,这个path默认是'/',也就是处理任何请求,同时要注意的是他会处理path下的子路径,好比若是设置path为'/hello',那么当请求路径为'/hello/','/hello/nihao','/hello/bye'这样的请求都会交给中间函数处理的。

因而咱们如今知道了app.use(express.static(__dirname + '/public'))是将全部请求,先交给express.static(__dirname + '/public')来处理一下,虽然咱们暂时不知道express.static()的处理细节,可是这不影响咱们作出一些推测,最起码咱们能够知道,express.static()的返回值确定是一个函数。

官方文档十分详尽,像咱们解释了express.static()的一些细节,我简单的翻译给你们:

Serving static files in Express

为了提供对静态资源文件(图片、csss文件、javascript文件)的服务,请使用Express内置的中间函数 express.static 。

传递一个包含静态资源的目录给 express.static 中间件用于马上开始提供文件。好比用如下代码来提供public目录下的图片、css文件和javascript文件:

app.use(express.static('public'));

如今,你能够加载 public目录下的文件了:

http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/images/bg.png
http://localhost:3000/hello.html

Express 会在静态资源目录下查找文件,因此不须要把静态目录做为URL的一部分。

 经过屡次使用 express.static 中间件来添加多个静态资源目录:

app.use(express.static('public'));
app.use(express.static('files'));

Express 将会按照你设置静态资源目录的顺序来查找静态资源文件。

为了给静态资源文件建立一个虚拟的文件前缀(实际上文件系统中并不存在) ,可使用 express.static 函数指定一个虚拟的静态目录,就像下面这样:

app.use('/static', express.static('public'));

如今你可使用 /static 做为前缀来加载 public 文件夹下的文件了。

http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js
http://localhost:3000/static/images/bg.png
http://localhost:3000/static/hello.html

然而,你提供给 express.static 函数的路径是一个相对node进程启动位置的相对路径。若是你在其余的文件夹中启动express app,更稳妥的方式是使用静态资源文件夹的绝对路径: 

app.use('/static', express.static(__dirname + '/public'));
相关文章
相关标签/搜索