企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
##模块化代码结构 - Node 采用的模块化结构是按照 CommonJS 规范 - 模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件。 >CommonJS 就是一套约定标准,不是技术;用于约定我们的代码应该是怎样的一种结构; http://wiki.commonjs.org/wiki/CommonJS >CommonJS 模块的特点 - 所有代码都运行在模块作用域,不会污染全局作用域。 - 模块可以多次加载,但是只会在第一次加载时运行一次,然后 运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。 - 模块加载的顺序,按照其在代码中出现的顺序。 ##模块的分类 - 文件模块 就是我们自己写的功能模块文件 - 核心模块 Node 平台自带的一套基本的功能模块,也有人称之为 Node 平台的 API - 第三方模块 社区或第三方个人开发好的功能模块,可以直接拿回来用 ##模块化开发的流程 ![](https://box.kancloud.cn/2016-07-10_5781f63685742.png) ##模块内全局环境(伪) - 我们在之后的文件操作中必须使用绝对路径 - __dirname 用于获取当前文件所在目录的完整路径; 在 REPL 环境无效; - __filename 用来获取当前文件的完整路径; 在 REPL 环境同样无效; - module 模块对象 - exports 映射到 module.exports 的别名 - require() require.cache require.extensions require.main require.resolve() ###module 对象 - Node 内部提供一个 Module 构建函数。所有模块都是 Module 的实例,属性如下: module.id 模块的识别符,通常是带有绝对路径的模块文件名。 module.filename 模块定义的文件的绝对路径。 module.loaded 返回一个布尔值,表示模块是否已经完成加载。 module.parent 返回一个对象,表示调用该模块的模块。 module.children 返回一个数组,表示该模块要用到的其他模块。 **module.exports 表示模块对外输出的值。** - 载入一个模块就是构建一个 Module 实例。 ##模块的定义 - 一个新的 JS 文件就是一个模块; - 一个合格的模块应该是有导出成员的,否则模块就失去了定义的价值; - 模块内部是一个独立(封闭)的作用域(模块与模块之间不会冲突); - 模块之间必须通过导出或导入的方式协同; - 导出方式: ``` exports.name = value; module.exports = { name: value }; ``` **module.exports 和 exports** - module.exports 是用于为模块导出成员的接口 - exports 是指向 module.exports的别名,相当于在模块开始的时候执行: `var exports = module.exports`; - 一旦为 module.exports赋值,就会切断之前两者的相关性; - 最终模块的导出成员以 module.exports 为准 ##载入模块 require 函数 ###require 简介 - Node 使用 CommonJS 模块规范,内置的 require 函数用于加载模块文件。 - require 的基本功能是,读入并执行一个 JavaScript 文件,然后返回该模块的 exports 对象。 - 如果没有发现指定模块,会报错。 ##require 扩展名 ```js require 加载文件时可以省略扩展名: require('./module'); // 此时文件按 JS 文件执行 require('./module.js'); // 此时文件按 JSON 文件解析 require('./module.json'); // 此时文件预编译好的 C++ 模块执行 require('./module.node'); // 载入目录module目录中的 package.json 中main指向的文件 require('./module/default.js'); // 载入目录module 中的index.js文件 ``` ##require 加载文件规则 - 通过 ./ 或 ../ 开头:则按照相对路径从当前文件所在文件夹开始寻找模块; require('../file.js'); => 上级目录下找 file.js 文件 - 通过 / 开头:则以系统根目录开始寻找模块;require('/Users/iceStone/Documents/file.js'); => 以绝对路径的方式找 没有任何异议 - 如果参数字符串不以“./“ 或 ”/“ 开头,则表示加载的是一个默认提供的核心模块(位于 Node 的系统安装目录中): require('fs'); => 加载核心模块中的文件系统模块 或者从当前目录向上搜索 node_modules 目录中的文件:require('my_module'); => 各级 node_modules 文件夹中搜索 my_module.js 文件; ###require 加载目录规则 - 如果 require 传入的是一个目录的路径,会自动查看该目录的 package.json 文件,然后加载 main 字段指定的入口文件 - 如果package.json文件没有main字段,或者根本就没有package.json文件,则默认找目录下的 index.js 文件作为模块: require('./calcuator'); => 当前目录下找 calculator 目录中的 index.js 文件 ##常用内置模块清单 如果只是在服务器运行 JavaScript代码,意义并不大,因为无法实现任何功能(读写文件,访问网络)。 Node 的用处在于它本身还提供的一系列功能模块,用于与操作系统互动。 这些核心的功能模块在 Node 中内置。 内置如下模块: - [path](http://nodejs.org/api/path.html):处理文件路径。 - [fs](http://nodejs.org/api/fs.html):操作文件系统。 - [child_process](http://nodejs.org/api/child_process.html):新建子进程。 - [util](http://nodejs.org/api/util.html):提供一系列实用小工具。 - [http](http://nodejs.org/api/http.html):提供HTTP服务器功能。 - [url](http://nodejs.org/api/url.html):用于解析URL。 - [querystring](http://nodejs.org/api/querystring.html):解析URL中的查询字符串。 - [crypto](http://nodejs.org/api/crypto.html):提供加密和解密功能。 - [其他](https://nodejs.org/api/)