JavaScript 规范(ECMAScript)没有定义一套完善的能适用于大多数程序的标准库。CommonJS 提供了一套 JavaScript 标准库规范。Node 实现了 CommonJS 规范。
模块基础
在 Node 中,模块和文件是一一对应的。我们定义一个模块:
// circle.js var PI = Math.PI; // 导出函数 area exports.area = function(r) { return PI * r * r; } // 导出函数 circumference exports.circumference = function(r) { return 2 * PI * r; };
var circle = require('./circle.js'); console.log('The area of a circle of radius 4 is ' + circle.area(4));
模块的加载
Node 会对加载过的模块进行缓冲,避免再次加载的开销:
// test.js console.log("I'm here");
多次加载模块 test.js
// 仅仅输出一次 "I'm here" require('./test'); require('./test');
当加载文件没有后缀时,Node 会尝试添加后缀并加载:
1..js(JavaScript 源文件)
2..node(C/C++ 扩展模块)
3..json(JSON 文件)
模块主要有几类:
1.核心模块。核心模块已经被编译到了 Node 中,我们在其源码中的 lib 目录可以找到这些核心模块。常见的核心模块:net、http、fs 模块等
2.文件模块。文件模块通过一个相对或者绝对路径加载,例如我们上面看到的 circle.js
3.自定义模块。自定义模块位于 node_modules 目录中,我们通过 npm 安装的各种模块就放置在 node_modules 目录中
核心模块总是优先被加载,假如有一个自定义模块 http,那么加载时仍然会加载核心模块 http 而非自定义模块 http。在加载自定义模块时,首先查找当前目录下的 node_modules 目录,而后查找父目录下的 node_modules 目录,以此类推,直到根目录。
require 加载的模块不是一个文件,而是一个目录时,这样的目录被叫做包(package)。包中存在一个名为 package.json 的文件(包描述文件),例如:
{ "name" : "some-library", "main" : "./lib/some-library.js" }
其中 main 指出需要被加载的模块。如果包中不存在 package.json 或者 package.json 中未指定 main 模块,那么 Node 将会尝试加载 index.js、index.node、index.json。
在加载 JavaScript 模块时,被加载的模块被包裹在一个函数中:
function(module, exports, __filename, __dirname, ...) { JavaScript module }
每个 JavaScript 模块访问到的 module、exports、__filename、__dirname 等实际上是通过函数参数传递进来的。由于这种包裹,才使得模块的局部变量外部无法访问。但有时候也会出现让人难以理解的问题,例如:
test1.js
exports = { name: 'Name5566', }
test2.js
module.exports = { name: 'Name5566', }
加载这两个模块:
var test1 = require('./test1.js'); console.log(test1.name); // undefined var test2 = require('./test2.js'); console.log(test2.name); // Name5566
exports 作为参数传递给模块,我们通过 exports.x 自然可以给 exports 对象添加属性(或方法),但直接给 exports 赋值(例如,exports = x)仅仅是改变了形参而非实参的值,因此:
1.为 exports 添加属性时,使用 exports
2.为 exports 赋值时,使用 module.exports
包
按 CommonJS 的规范,一个完整的包应该包含有:
1.package.json 包描述文件
2.bin 二进制文件目录
3.lib JavaScript 代码目录
4.doc 文档目录
5.test 测试代码目录
NPM 是一个 Node 的一个包管理工具。常见用法:
查看命令的文档:
npm help install
查看命令 install 的文档。
安装一个包:
npm install redis
移除一个包:
npm remove redis
本文向大家介绍Nodejs极简入门教程(二):定时器,包括了Nodejs极简入门教程(二):定时器的使用技巧和注意事项,需要的朋友参考一下 setTimeout 和 clearTimeout setTimeout 用于设置一个回调函数 cb,其在最少 ms 毫秒后被执行(并非在 ms 毫秒后马上执行)。setTimeout 返回值可以作为 clearTimeout 的参数,clearTimeout
本文向大家介绍JavaScript极简入门教程(一):基础篇,包括了JavaScript极简入门教程(一):基础篇的使用技巧和注意事项,需要的朋友参考一下 阅读本文需要有其他语言的编程经验。 开始学习之前 大多数的编程语言都存在好的部分和差的部分。本文只讲述 JavaScript 中好的部分,这是因为: 1.仅仅学习好的部分能够缩短学习时间 2.编写的代码更加健壮 3.编写的代码更加易读 4.编写
本文向大家介绍JavaScript极简入门教程(三):数组,包括了JavaScript极简入门教程(三):数组的使用技巧和注意事项,需要的朋友参考一下 阅读本文需要有其他语言的编程经验。 在 JavaScript 中数组是对象(而非线性分配的内存)。 通过数组 literal 来创建数组: 数组有一个属性 length(而对象没有)表示数组的长度。length 的值为数组的最大整数属性名加 1:
1. 概述 2. 部署单机 TC Server 3. 部署集群 TC Server 4. 接入 Java 应用 1. 概述 Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。 1.1 四种事务模式 Seata 目标打造一站式的分布事务的解决方案,最终会提供四种事务模式: AT 模式:参见《Seata AT 模式》文档 TCC 模式:参见《Seata
本文向大家介绍JavaScript极简入门教程(二):对象和函数,包括了JavaScript极简入门教程(二):对象和函数的使用技巧和注意事项,需要的朋友参考一下 阅读本文需要有其他语言的编程经验。 JavaScript 中的简单类型包括: 1.数字 2.字符串 3.布尔(true 和 false) 4.null 5.undefined 此外的其他类型均是对象(我们不要被 typeof 操作符的返
Kotlin是JetBrains团队开发的一门现代的、注重工程实用性的静态类型编程语,JetBrains团队以开发了世界上最好用的IDE而著称。