Menu
CoddyTech

CommonJS 模块

本课属于 Coddy Node.js 学习旅程的“Node.js 基础”单元。第 10 课,共 33 课。

你会在 npm 包和较早的教程中读到许多使用另一种模块系统的 Node 代码。

CommonJS 使用 module.exports 导出,并使用 require 导入。以 .cjs 结尾的文件始终是 CommonJS 文件,不受项目其他部分所用模块系统的影响;导入这类文件时,会将它的 module.exports 对象作为默认导出:

// greet.cjs
function hello(name) {
    return 'Hello, ' + name;
}
module.exports = { hello };

// app.js
import greet from './greet.cjs';
console.log(greet.hello('Ada'));

exports 初始时与 module.exports 指向同一个对象。exports.hello = hello 会向其中添加内容;exports = { hello } 会替换变量,导入方得到的则是一个空对象。

challenge icon

挑战

简单

较旧的文件 legacy/stats.cjs 使用 CommonJS 方式编写,采用 module.exports。在你的 notes.js 中使用它,添加一个 stats 命令。

  1. 在 legacy/stats.cjs 中,完成 countWords(notes)。它接收一个由笔记组成的数组,并返回所有笔记中的单词总数。单词之间用空格分隔。对于最初的三条笔记,Buy milk、Call Ada 和 Water the plants,它会返回 7。对于空数组,它会返回 0。
  2. 在 notes.js 中,使用 import stats from './legacy/stats.cjs' 导入该文件。它是一个 CommonJS 文件,因此 stats 是它的 module.exports 对象,而函数是 stats.countWords。
  3. 在命令链中、最后一个 else 之前添加一个 stats 命令。它会打印一行内容:笔记数量,然后是单词数量。
    3 notes, 7 words
    where 和其他命令仍然可以正常使用。

试试看:在 $ node notes.js 后面的输入框中输入 stats,然后按 Enter。你会看到 3 notes, 7 words。接着输入 add Buy bread,再输入一次 stats:你仍会看到 3 notes, 7 words,因为程序结束时,存储区会忘记新笔记。

亲手试试

// 一个较旧的模块,采用 CommonJS 方式编写。
function countWords(notes) {
    // 返回所有 notes 中的单词总数。
    return 0;
}

module.exports = { countWords };

Node.js 基础中的所有课

自己练习: Express 在线编辑器