nodejs引入自定义模块

js 模块 nodejs 编程技术
发布日期 2023-07-15 更新日期 2023-07-15 阅读次数 57 文章字数 992

在nodejs中,每个文件都是一个单独的模块

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,是内置的

尝试打印一下console.log(module);

module上有一些属性:

  • id,模块的标识符
  • exports,模块的导出对象
  • parent,表示当前模块的父模块,当前模块是谁加载的
  • filename,模块的绝对路径
  • loaded,表示是否加载完成
  • children,表示当前模块加载了哪些模块
  • paths,表示模块的搜索路径,路径的多少取决于目录的深度,寻找第三方模块时会用到

在模块的内部,this指向的是当前模块的导出对象:

 
console.log(this === module.exports); // true
console.log(this === exports); // true

NodeJS支持三种类型的文件,.js.json.node(C++扩展二进制模块)。

模块类型分为核心模块、文件模块、第三方模块,其中核心模块是编译二进制文件,加载速度最快,比如fs/path/http等。

当尝试加载一个不带后缀的文件时,比如require('./test'),会依次尝试test/test.js/test.json/test.node

再看一下模块的缓存,缓存可以通过require.cache查看,其返回一个对象,key是文件绝对路径,valueModule对象。

  1. CommonJS加载的是一个对象(module.exports属性),只有脚本运行时该对象才会确定,所以CommonJS是运行时加载。
  2. CommonJS输出的是一个值的拷贝,也就是说模块输出一个值后,模块内部的变化就影响不到该值。
  3. CommonJS模块是同步加载,由于是运行时加载,且从写法可以看出来,没有回调或promise.then方法,所以是同步的。

对比一下ES6的import语法,ES6是编译时输出接口,输出的是值的引用,且ES6模块是异步加载,有独立的模块依赖的解析阶段。

模块的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

如果对exports直接赋值,也就是给它一个新的引用地址,会切断其与module.exports的引用关系,也就会导致require加载不到。

简单使用例子:

aa.js

test.js

在aa.js中写入代码:

module.exports={
    a:1
}

在test.js中引入

let res = require("./aa.js");
console.log(res);
console.log(res.a+1);

文章作者: 朱丰华

文章链接: https://smart.52dixiaowo.com/blog/post-447.html

版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。

js 模块 nodejs

发表评论

相关推荐
朱丰华   |   1年前   |   页面 · 监听

iframe子父页面信息传递与监听

429    评论    点赞
朱丰华   |   1年前   |   git · hub · 仓库

go克隆并引用github仓库

162    评论    点赞
朱丰华   |   1年前   |   < · iframe

让iframe嵌入的视频自适应 (100%宽度)?

135    评论    点赞
朱丰华   |   1年前   |   js · 重复

js如何避免重复监听addEventListener事件?

146    评论    点赞
朱丰华   |   1年前   |   html · id · <

html同一个页面有两个相同id ,如何用id选择器选中

122    评论    点赞
朱丰华   |   1年前   |   php

windows下编写、编译php扩展

177    评论    点赞
朱丰华   |   1年前   |   linux · php

linux下编写、编译php扩展

161    评论    点赞
朱丰华   |   1年前   |   js · export · import

js es6 export,import,export default的用法和区别

137    评论    点赞
朱丰华   |   1年前   |   js · vue · 监听

js vue监听,深度监听

122    评论    点赞
朱丰华   |   1年前   |   vue · model

vue语法v-model原理与实现

131    评论    点赞
朱丰华   |   1年前   |   javascript · js · obfuscator · 混淆

javascript-obfuscator混淆js文件

59    评论    点赞
朱丰华   |   1年前   |   js · vue · npm · 安装

npm快速上手

110    评论    点赞
朱丰华   |   1年前   |   nvm · git · 安装

entos7安装、使用nvm

83    评论    点赞
朱丰华   |   1年前   |   js · 滚动 · html

原生js实现顶部进度条效果

66    评论    点赞
朱丰华   |   1年前   |   python

python怎么引入自定义的子目录、父目录文件?

74    评论    点赞
朱丰华   |   1年前   |   python · linux · www

linux给www用户【非root】安装python3

212    评论    点赞
朱丰华   |   1年前   |   js · php · 字符 · 字符串

php json_encode对字符串转义用法

143    评论    点赞
朱丰华   |   1年前   |   php · api · 扩展 · 执行

php sapi生命周期

99    评论    点赞
朱丰华   |   1年前   |   api

api接口的参数"原子"设计

91    评论    点赞
朱丰华   |   1年前   |   javascript · 属性 · 对象

javascript 判断对象是否拥有某个属性,删除某个属性

172    评论    点赞
{{item.author_name}}   |   {{new Date(item.date*1000).log()}}   |   {{it}} ·

{{item.title}}

{{item.uv}}    评论    点赞