用node.js 搭建服务器, 首选框架就是 express。 这里,我们来深入了解下Express应用的细节。
相信每个人都会用到这个方法:
app.use(express.static(__dirname+ '/public'));
特别注意: public 前面一定要加上 " / " 这个表示路径的符号。 而且 dirname 前面是两个短划线。
你肯定在你的app文件中这么用过它:
app.use(express.static (__dirname + "/public") ); //设置静态资源(文件)目录
正如注释中写的那样,这句话的意思是,将静态文件目录设置为:项目根目录+ public。
app.use 的理解
app.use在express中被看成是消息中间件 middleware
app.use(express.static(__dirname + '/public'));
app.use(logger());
app.use(function(req, res){
res.send('Hello');
});
每一个请求都会到 app.use 里面过一遍。
app.use(express.static(XX)) 的另一种写法
当然,你也可以这样写:
app.use(express.static ( path.join( __dirname + "public" )));
引用 path 模块的 join 方法,其作用与前面的那行代码是等价的,注意,这里要引入 path 模块。
var path = require ('path');
那么,为什么要引入静态资源文件呢? 其目的是为了设置一个可供浏览器访问的目录。 只有这个目录下的文件,浏览器才能访问到。
细究起来, 为什么以上这行代码能够帮我们设置静态资源文件呢? 它到底做了些什么呢?
静态资源文件,通俗地可以理解为,对于不同的用户来说,内容都不会变化的文件。这些资源文件包括: 你看到的图片、CSS文件、和前端的 javascript文件。
app.use ([paht,] function [, function ...] ) 是用来注册中间件函数的。
通过 app.use(express.static(__dirname + 'public')),可以将所有请求,先交给express.static(__dirname + 'public')来处理一下。
虽然我们暂时不知道express.static()的处理细节,但是这不影响我们做出一些推测,最起码我们可以知道,express.static()的返回值肯定是一个函数。
此时,你就可以通过浏览器访问 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
我们注意到, URL中没有包含 public 路径, 这是为什么呢?
这是因为,Express 会在静态资源目录下查找文件,所以不需要把静态目录作为URL的一部分。
为了给静态资源文件创建一个虚拟的文件前缀(实际上文件系统中并不存在) ,可以使用 express.static 函数指定一个虚拟的静态目录,就像下面这样:
app.use('/static', express.static (__dirname + "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
对 __dirname 的疑惑
有时候, 不用 __dirname 也是可以的,比如:
app.use('/static', express.static ( "/public"));
你可以认为, __dirname 表示一个绝对路径, 如果你在其他的文件夹中启动 express app,更稳妥的方式是使用静态资源文件夹的绝对路径:
app.use('/static', express.static (__dirname + "public"));
如何理解 __dirname?
注: “__dirname” 是 node.js 中的一个全局变量,它指向当前脚本所在的目录。 “__dirname” 变量值代表程序运行的根目录。
小结
在基于 node.js 全栈开发中, 很多用法是约定俗称的。 当然,你可以按照自己的意向来改动, 但这样一改,如果对套路不是很清楚, 就给自己挖了一个“坑”。 建议初学者还是按照约定的风格编写代码,以免造成不必要的麻烦。 作为开发工程师,要把精力集中在产品的业务逻辑上,而不是纠结代码本身。