NodeJS
使用 CommonJS 模块系统。
整个项目都是由一个个模块组成的,模块的存在形式是文件,他们一一对应。
模块中,通过exports来输出函数、变量和对象,供调用者使用。
通过require() 来加载各模块。
require
语法 | 解释 | 举例 |
---|---|---|
require('http') | 内置模块,核心模块,原生模块,核心模块在 Node 源代码的 lib/ 文件夹中定义 | |
require('/home/marco/foo.js') | 绝对路径,如果没有找到确切的文件(比如没有后缀的文件),Node 将尝试给所需的文件名添加 .js 后缀再加载,然后再尝试 .node。.js 文件被视为 JavaScript 文本文件,而 .node 文件被视为已编译的插件模块,用 dlopen 加载。 | |
require('./server') | “./”表示当前路径,后面跟的是相对路径。对目录的加载,细节请看下面专门介绍 | |
require("../lib/server") | ../表示上一级目录,后面跟的也是相对路径 |
文件模块
Node 有一个简单的模块加载系统。在 Node 中,文件和模块一一对应。
如果没有找到确切的文件,Node 将尝试给所需的文件名添加 .js 后缀再加载,然后再尝试 .node。
.js 文件被视为 JavaScript 文本文件,而 .node 文件被视为已编译的插件模块,用 dlopen 加载。
模块以 '/' 开头表示使用文件的绝对路径。
模块以 './' 开头表示调用 require() 时使用相对路径。
如果不以 '/' 或'./' 开头,该模块可以是一个“核心模块”,也可是一个从 node_modules 文件夹中加载的模块。
如果传递给 require() 有模块标识符是不是原生模块,而且不以 '/'、'../' 或'./' 开头,那么 Node 从当前模块的父目录+/node_modules 这个位置尝试加载。
如果还是没有找到,那么它跳到上层目录并依此类推,直到找到模块,或者达到根目录为止。
以文件夹作为模块
Node 允许用户在独立的目录中方便地组织程序,然后提供单一入口指向该库。有三种方式可以将文件夹作为 require() 的参数。
第一种方式是在该文件夹中创建 package.json 文件,指定一个 main 模块。一个典型的 package.json 文件可能看起来像这样:
{ "name" : "some-library",
"main" : "./lib/some-library.js" }
如果此文件位于 ./some-library 文件夹,则 require('./some-library') 会尝试加载 ./some-library/lib/some-library.js。
这是 Node 能找到 package.json 文件的情况。
如果在该目录中没有 package.json 文件,那么 Node 将尝试加载该目录中的 index.js 或 index.node 文件。例如,如果上面的例子找不到 package.json,那么 require('./some-library') 将试图加载:
./some-library/index.js
./some-library/index.node
require.resolve()
在Node.js中,可以使用require.resolve函数来查询某个模块文件的带有完整绝对路径的文件名,代码如下所示。
require.resolve('./testModule.js');
在这行代码中,我们使用require.resolve函数来查询当前目录下testModule.js模块文件的带有完整绝对路径的模块文件名。
注意:使用require.resolve函数查询模块文件名时并不会加载该模块。
建议
一个可以工作的建议的目录结构:
比方说,我们希望 /usr/lib/node/<some-package>/<some-version> 文件夹中包含某个包的特定版本的内容。然后在 node_modules 文件夹用上文描述的方式查找依赖。
ng-repeat数组有重复值的处理方法
<li ng-repeat="item in items track by $index">{{ item }}</li>
网友评论