查看“JS模块:CJM”的源代码
←
JS模块:CJM
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Node.js]] == 关于 == 规范的主要内容:模块必须通过 '''module.exports''' 导出对外的变量或接口,通过 '''require()''' 来导入其他模块的输出到当前模块作用域中。 1、所有代码都运行在模块作用域,不会污染全局作用域 —— 一个文件就是一个模块 2、模块初次加载会被缓存,再次使用将从缓存中读取 —— 要让模块再次运行,必须清除缓存 Node.js 将对模块代码封装为如下形式: : <syntaxhighlight lang="JavaScript" highlight=""> (function(exports, require, module, __filename, __dirname) { // 模块代码实际存在于此处 }); </syntaxhighlight> * 将变量限制在在模块内。 * 提供了使用模块的属性、方法: *# '''__dirname''':当前模块的绝对目录名; *# '''__filename''':当前模块的绝对文件名; *# '''exports''':对 module.exports 的引用; *# '''module''':(对象)对当前模块的引用; *# '''require''':(方法)用于导入其他模块(核心模块、文件模块、第三方模块); === <span style="color: blue">exports</span> === exports 变量:是'''对 module.exports 的引用''' —— ❗ <span style="color: blue">不能对 exports 进行赋值操作</span>,否则只是让其不再对 module.exports 进行引用,而变成一个局部变量。 正确用法: : <syntaxhighlight lang="JavaScript" highlight=""> exports.area = function(x) {console.log(x)}; </syntaxhighlight> 错误用法: : <syntaxhighlight lang="JavaScript" highlight=""> exports = function(x) {console.log(x)}; </syntaxhighlight> === <span style="color: blue">module</span> === module 变量:是'''一个代表当前模块的对象''' 它提供了以下属性: # '''module.id''':模块的识别符,通常是模块的完全解析文件名。 # '''module.filename''':模块的完全解析文件名(带有绝对路径的文件名)。 # '''module.parent''':(对象)表示调用该模块的模块。 # '''module.children''':(数组)表示该模块用到的其他模块。 # '''module.isPreloading''':(布尔值)表示模块是否在 Node.js 预加载阶段运行。 # '''module.loaded''':(布尔值)表示模块是否已经完成加载。 # '''module.exports''':表示模块对外输出的值。 <span style="color: blue">module.exports 属性表示当前模块对外输出的接口。加载某个模块,其实是加载该模块的 module.exports 属性。</span> ❗ <span style="color: blue">不建议同时使用 exports 与 module.exports</span>:可能导致对外输出失效。 示例: : <syntaxhighlight lang="JavaScript" highlight=""> exports.hello = function() { return 'hello'; }; module.exports = 'Hello world'; </syntaxhighlight> : 如上,exports 的输出会因 module.exports 重新赋值而失效。 === <span style="color: blue">require</span> === require 变量:通常就是模块的 require() 方法 它提供了以下属性、方法: # '''require(id)''':用于导入模块、JSON 和本地文件。 #* id 即 module.id(模块识别符), 可以使用相对路径(将根据 __dirname 或当前工作目录进行解析); # '''require.cache''':(对象)缓存对象,模块在需要时缓存在此对象中。 # '''require.main''':(对象)代表 Node.js 进程启动时加载的入口脚本。 #* 如果程序的入口点不是 CommonJS 模块,则为 undefined; # '''require.resolve(request[, options])''':查找模块位置,但不加载模块,只返回解析的文件名。 #* request:要解析的模块路径; #* 如果找不到模块,则会抛出 MODULE_NOT_FOUND 错误; # '''require.resolve.paths(request)''':如果 request 字符串引用核心模块(如 http 或 fs),则返回包含在解析 request 或 null 期间搜索的路径的数组。 #* request:要解析的模块路径; === <span style="color: blue">Module</span> === Module 对象:Node 内部的构建函数,提供了当与 Module 的实例交互时提供通用的实用方法 所有模块(module)都是 Module 的实例。 它提供了以下属性、方法: # '''module.builtinModules''':Node.js 提供的所有模块的名称列表。 #* 要访问它,需要 Node 内部的 Module 模块: #*: <syntaxhighlight lang="JavaScript" highlight=""> import { builtinModules as builtin } from 'node:module'; </syntaxhighlight> #* 可用于:验证模块是否由第三方维护; # '''module.createRequire(filename)''':用于构造 require 函数的文件名。 #* filename:(string / URL)用于构造 require 函数的文件名(必须是文件网址对象、文件网址字符串、或绝对路径字符串); # '''module.isBuiltin(moduleName)''':用于判断一个模块是否为“内置模块”。 #* moduleName:模块名称 # '''module.syncBuiltinESMExports()''':用于更新内置的 ES 模块的所有实时绑定,以匹配 CommonJS 导出的属性。❓ == 加载过程 == 要加载的内容可能包括:内置模块、文件模块、第三方模块。 <big>'''内置模块'''</big>:即“原生模块”,在 Node.js 源代码中定义,位于“lib/”文件夹中 # 解析 <code>module.id</code>:得到 <code>filename</code> 为原生模块标识符(如“fs”); # 判断 <code>Module_cache[filename]</code> 是否命中缓存: ## 缓存命中:则从缓存中返回该模块的 <code>module.exports</code> —— 【结束加载】 ## 缓存未命中:加载该原生模块,然后返回其 <code>module.exports</code> 并缓存 —— 【结束加载】 #* 使用<code>'''node:'''</code>前缀来识别核心模块,可以绕过 require 缓存(即使有该名称的 require.cache 条目); <big>'''文件模块'''</big>:“相对路径”或“绝对路径”指向的本地模块 # 解析 <code>module.id</code>:得到一个“绝对路径”('''文件 / 目录'''); # 根据“绝对路径”查找“<code>filename</code>”: ## 将 <code>filename</code> 作为“'''文件'''”进行查找: ### 直接命中文件:<code>filename</code> 即为该文件的全解析路径; ### 没有直接命中:为 <code>filename</code> 添加扩展名(<code>.js</code>、<code>.json</code>、<code>.node</code>),再尝试“查找” ## 将 <code>filename</code> 作为“'''目录'''”进行查找: ### 目录下存在“'''package.json'''”文件:根据其“'''main'''”字段得到新的 <code>filename</code>,再尝试“查找” ### 若没有“package.json”文件(或其中没有“main”字段):查找目录下的“'''index'''”文件,将其路径作为<code>filename</code>,再尝试“查找” ##(如果以上皆未能命中)抛出错误 <code>MODULE_NOT_FOUND</code>。 # 判断 <code>Module_cache[filename]</code> 是否命中缓存: ## 缓存命中:则从缓存中返回该模块的 <code>module.exports</code> —— 【结束加载】 ## 缓存未命中:加载该原生模块,然后返回其 <code>module.exports</code> 并缓存 —— 【结束加载】 <big>'''第三方模块'''</big>:第三方提供的模块,位于“'''node_modules'''”目录中 # 在“node_modules”查找“<code>filename</code>”: #* “查找”过程,与【文件模块】类似 #* 从“当前目录的 node_modules”到“根目录的 node_modules”依次查找 #*: <syntaxhighlight lang="bash" highlight=""> [ '/root/path/to/module/node_modules', '/root/path/to/node_modules', '/root/path/node_modules', '/root/node_modules', '/node_modules', ] </syntaxhighlight> # 判断 <code>Module_cache[filename]</code> 是否命中缓存: ## 缓存命中:则从缓存中返回该模块的 <code>module.exports</code> —— 【结束加载】 ## 缓存未命中:加载该原生模块,然后返回其 <code>module.exports</code> 并缓存 —— 【结束加载】 == 循环引用 == == 参考 == <references/>
返回至“
JS模块:CJM
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息