• Node.js模块系统
  • 概况
  • 模块系统用来让Node.js文件可以相互调用
  • 模块时Node.js应用程序的基本组成部分,文件和模块一一对应
  • 这个文件可以是JavaScript代码,JSON或者编译过的C/C++扩展
  • 创建模块
  • main.js
1 var hello = require('./hello');
2 hello.world();
  • hello.js
1 exports.world = function() {
2     console.log('Hello World!');
3 }
  • Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象
  • 服务端的模块存储位置
  • Node.js的require方法具有固定的查找策略
  • 从文件模块缓存中加载,优先级最高
  • 从原生模块加载,优先级仅次于文件模块缓存,而原声模块也具有一个缓存区
  • 从文件加载,当文件模块缓存中不存在,且不是原生模块,Node.js会解析require方法传入的参数,从文件系统中加载实际的文件
  • 接收以下几种参数的传递
  • http/fs/path 原生模块
  • ./mode  ../mod 相对路径的文件模块
  • /pathtomodule/mode 绝对路径的文件模块
  • mod 非原生模块的文件模块
  • Node.js函数
  • 概况
  • 函数可以作为参数,可以预先定义函数,作为参数传递,也可直接在传递参数的地方定义参数,这样函数可以匿名
  • 函数同样可以作为变量,比如可以这样
1 function exe(someF, value) {
2     someF(value);
3 }

 someF作为一个函数参数

  • 注意匿名函数的使用方式,这个已经很熟悉了
  • Node.js路由
  • 使用典型的MVC架构,浏览器发送请求,由路由控制接受,根据不同的路径定向到不同的服务器,而控制器处理用户具体的请求,比如访问数据库中的对象,即模型部分,生成视图的HTML,最后再由控制器返回给浏览器,完成一次请求
  • 模块基本思路
  • 我们需要为路由请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码
  • 因此我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数,这一功能究竟属于服务器还是路由值得探讨,但暂定为HTTP服务器的功能
  • 我们需要的数据都包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。而为了解析这些数据,需要额外的模块,url和querystring
  • 模块代码
  • server.js
1 var http = require("http");
 2 var url = require("url");
 3 
 4 function start(route){
 5     function onRequest(request, response){
 6         var pathname = url.parse(request.url).pathname;
 7         console.log("Request for " + pathname + " received.");
 8         
 9         route(pathname);
10         
11         response.writeHead(200, {"Content-Type": "text/plain"});
12         response.write("Hello World!");
13         response.end();
14     }
15     
16     http.createServer(onRequest).listen(8888);
17     console.log("Server has started.");
18 }
19 
20 exports.start = start;
  • router.js
1 function route(pathname){
2     console.log("About to route a request for" + pathname);
3 }
4 
5 exports.route = route;
  • index.js
1 var server = require("./server");
2 var router = require("./router");
3 server.start(router.route);
  • 显示
F:\nodejs\Project>node index.js
Server has started.
Request for / received.
About to route a request for/
Request for /favicon.ico received.
About to route a request for/favicon.ico
  • favicon.ico
  • 指的是网站图标文件,即显示在网站地址最前面的一张图片,可以在网站根目录放置图片,且命名为FAVICON.ICO
  • favorites icon 显示在收藏夹或者地址栏
  • 浏览器调用原理是首先在网页所在目录寻找favicon.ico文件,没有找到就到网站的根目录去找