NodeJS模块的导入导出,包文件

2024-06-22 17:38
文章标签 nodejs 导入 模块 导出

本文主要是介绍NodeJS模块的导入导出,包文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 导入模块
    • 1.1 加载模块作用
    • 1.2加载规则
      • 1.2.1 从缓存中加载
      • 1.2.2 判断模块标识
      • 1.2.3 加载文件和目录
        • 1.2.3.1 加载文件
        • 1.2.3.2 加载目录
  • 2 导出模块
    • 2.1 导出多个成员(必须在对象中)
    • 2.2 导出单个成员(函数,字符串)
    • 2.3 exports 和 module.exports 的区别
      • 2.3.1 相同点
      • 2.3.2 不同点
      • 2.3.3 总结
  • 3 包说明文件
    • 3.1 package.json文件
    • 3.2 package-lock.json文件

1 导入模块

var  自定义变量名 = require('模块');

1.1 加载模块作用

  • 核心模块,三方模块,自定义模块
  • 执行被加载模块中的代码
  • 得到被加载模块中的exports 导出接口对象

1.2加载规则

  • 优先从缓存中加载
  • 核心模块
  • 路径形式的文件模块
  • 第三方模块

1.2.1 从缓存中加载

例如:main.js,优先从缓存加载,由于 在 a 中已经加载过 b 了,所以 这里不会重复加载,可以拿到其中的接口对象,但是不会重复执行里面的代码, 这样做的目的是为了避免重复加载,提高模块加载效率

require('./a.js');
var fn = require('./b');
console.log(fn);

a.js

console.log("a.js被加载");
var fn = require('./b');
console.log(fn);

b.js

console.log("b.js被加载");
module.exports=function(){
console.log(fn);
}

1.2.2 判断模块标识

require('模块标识');
  1. 路径形式的模块
  • ./, …/,/xxx
  • 带盘符的绝对路径
  1. 核心模块
  • 核心模块的本质也是文件
  • 但是文件被编译到二进制文件中了,可直接使用
  1. 第三方模块
  • 凡是第三方模块都必须通过 npm 的方式来下载
  • 使用的时候就可以通过 require('包名') 的方式来进行加载才可以 使用
  • 既不是核心模块,也不算路径形式模块
    以模板引擎模块art-template为例来说明 加载规则

先找到当前文件所处目录中的node_modules目录
然后node_modules/art-template
最后找到node_modules/art-template/package.json文件中的main属性
然后main属性,记录了art-template的入口模块
如果package.json文件不存在或者没有main属性,那么就加载默认备选项 index.js

1.2.3 加载文件和目录

1.2.3.1 加载文件

require命令用于加载文件,后缀名默认为.js

var foo = require('foo');
//  等同于
var foo = require('foo.js');

根据参数的不同格式,require命令去不同路径寻找模块文件。

  1. 如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js
  2. 如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js
  3. 如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
    举例来说,脚本/home/user/projects/foo.js执行了require('bar.js')命令,Node会依次搜索以下文件。
  • /usr/local/lib/node/bar.js
  • /home/user/projects/node_modules/bar.js
  • /home/user/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js
    这样设计的目的是,使得不同的模块可以将所依赖的模块本地化
  1. 如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。
  2. 如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。
  3. 如果想得到require命令加载的确切文件名,使用require.resolve()方法。
1.2.3.2 加载目录

通常,我们会把相关的文件会放在一个目录里面,便于组织。这时,最好为该目录设置一个入口文件,让require方法可以通过这个入口文件,加载整个目录。
在目录中放置一个package.json文件,并且将入口文件写入main字段。下面是一个例子。

// package.json
{ "name" : "some-library","main" : "./lib/some-library.js" 
}

require发现参数字符串指向一个目录以后,会自动查看该目录的package.json文件,然后加载main字段指定的入口文件。如果package.json文件没有main字段,或者根本就没有package.json文件,则会加载该目录下的index.js文件或index.node文件

如果没有package.json文件那么加载规则则是:
X 当成目录,依次查找下面文件,只要其中有一个存在,就返回该文件,不再继续执行:

  • X/package.json(main字段)
  • X/index.js
  • X/index.json
  • X/index.node

2 导出模块

  • node中是模块作用域,默认文件中所有的成员只在当前文件模块有效
  • 对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports接口对象中就可以导出多个成员

2.1 导出多个成员(必须在对象中)

exports.a = 123;
exports.b ='hello';
exports.c=function(){console.log('ccc');
}

2.2 导出单个成员(函数,字符串)

module.exports='hello';

以下情况会覆盖

module.exports='hello';
//下面的会覆盖之前的hello
module.exports=function(x,y){return x+y;
}

2.3 exports 和 module.exports 的区别

2.3.1 相同点

  • node中,每个模块中都有一个 module 对象
  • module对象中有一个exports对象(默认是空对象
  • 我们可以把需要导出的成员都挂载到module.exports接口对象中,也就是:moudle.exports.xxx = xxx 的方式
  • 但是每次都 moudle.exports.xxx = xxx 很麻烦
  • 所以Node为了方便,同时在每一个模块中都提供了一个成员叫:exports
  • exports === module.exports 结果为 true
  • 所以对于:moudle.exports.xxx = xxx 的方式 完全可以:expots.xxx = xxx

2.3.2 不同点

  • 当一个模块需要导出单个成员的时候,这个时候必须使用:module.exports = xxx 的方式
  • 不要使用 exports = xxx因为这样不管用
  • 因为 每个模块最终向外return的是module.exports
  • exports 只是 module.exports 的一个引用
  • 所以即便为 exports = xx 重新赋值,也不会影响 module.exports
  • 但是有一种赋值方式比较特殊:exports = module.exports 这个用来重新建立引用关系的,而和之前的 exports 就没有关系了

2.3.3 总结

exports只是一个module.exports的引用 ,尽量不要破坏他们之间的引用关系就好了

3 包说明文件

NodeJS中的package.json和package-lock.json文件说明

3.1 package.json文件

package.json文件记录项目中所需要的所有模块。 当执行npm install的时候,node会先从package.json文件中读取所有dependencies信息,然后根据dependencies中的信息与node_modules中的模块进行对比, 没有的直接下载,已有的检查更新
另外,package.json文件只记录通过npm install方式安装的模块信息,而这些模块所依赖的其他子模块的信息不会记录。
npm init 命令生成包描述文件,在dos窗口里面 必须切换到要安装的目录,就会安装在那里 傻瓜式一路next,如下图:
包说明文件安装自动生成
包说明文件

{"name": "feed_back","version": "1.0.0","description": "留言板项目","main": "app.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "jingzh","license": "ISC","dependencies": {"jquery": "^3.4.1"}
}

3.2 package-lock.json文件

  • 这个是在 npm 5 以前是不会有 package-lock.json ,在5之后才加入了这个文件
  • package-lock.json是当安装包,node_modules 或 package.json发生变化时自动生成的文件。
  • npm5之后的版本不需要添加— — save ,它就会自动保存这个依赖信息
  • 这个文件主要功能是确定当前安装的包的依赖,以便后续重新安装的时候 生成相同的依赖 ,而忽略项目开发过程中有些依赖已经发生的更新。
  • package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖子模块。 当执行npm install的时候,node从package.json文件读取模块名称,从package-lock.json文件中获取版本号 ,然后进行下载或者更新

这篇关于NodeJS模块的导入导出,包文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084967

相关文章

iptables(7)扩展模块state

简介         前面文章我们已经介绍了一些扩展模块,如iprange、string、time、connlimit、limit,还有扩展匹配条件如--tcp-flags、icmp。这篇文章我们介绍state扩展模块  state          在 iptables 的上下文中,--state 选项并不是直接关联于一个扩展模块,而是与 iptables 的 state 匹配机制相关,特

python 在pycharm下能导入外面的模块,到terminal下就不能导入

项目结构如下,在ic2ctw.py 中导入util,在pycharm下不报错,但是到terminal下运行报错  File "deal_data/ic2ctw.py", line 3, in <module>     import util 解决方案: 暂时方案:在终端下:export PYTHONPATH=/Users/fujingling/PycharmProjects/PSENe

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

PHP生成csv格式Excel,秒级别实现excel导出功能

防止报超内存,兼容中文,兼容科学技术法。 爽。。。。很爽。。。。 /*** 告诉浏览器下载csv文件* @param string $filename*/public static function downloadCsv($data, $filename, $encoding = 'utf-8'){header("Content-type: text/csv");header("Conten

spring-boot-maven-plugin多模块install问题

一、问题描述:   项目分多个模块,open-eureka注册中心、open-provider服务提供者、open-common公共部分,provider依赖common。父pom使用spring-boot-maver-plugin插件,项目直接运行Main主类没问题,但是install报common中的类找不到符号. 二、查找问题:   spring-boot-maven-plugin 打

oracle数据导出txt及导入txt

oracle数据导出txt及导入txt ORACLE数据导出TXT及从TXT导入: 导出到TXT文件: 1、用PL/SQL DEV打开CMD窗口。 2、spool d:/output.txt; 3、set heading off; --去掉表头 4、select * from usergroup; 5、spool off; www.2ct

使用 devtool 本地调试 nodejs

安装 # 全局安装$ npm install devtool -g# 或临时安装$ npx devtool [file] [opts] 用法 Usage:devtool [入口文件] [opts]Options:--watch, -w enable file watching (for development) # 动态检测文件变更,不用每次手动重启--qui

上位机图像处理和嵌入式模块部署(mcu和swd接口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         最近学习mcu的时候,接触了不少调试器,这里面有daplink、st-link v2、j-link v9。虽然模块的形状可能不太一样,但是硬件的连线都差不多,都是mcu上的3.3v、clk、dio和gnd四根连线。出于好奇,今天花了点时间了解了一下debug port、sw

3. 向索引库中导入数据

1. 准备数据库对象 import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.AllArgsConstructo

使用import和exec运行模块文件的异同

使用import和exec运行模块文件的异同 实例代码 #script1.pyimport sysprint(sys.platform)x = 'span'print(x*8) 在cmd中 >>> import script1win32spanspanspanspanspanspanspanspan >>> exec(open('script1.py').read())win