位置: 编程技术 - 正文

Node.js中的模块机制学习笔记(node.js 模块)

编辑:rootadmin

推荐整理分享Node.js中的模块机制学习笔记(node.js 模块),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs中的模块加载机制有哪些,nodejs中的模块以及作用,nodejs中的模块加载机制有哪些,node.js 模块,nodejs中的模块以及作用,nodejs中的模块加载机制都有哪些,node.js中的模块分为,node.js中的模块分为,内容如对您有帮助,希望把文章链接给更多的朋友!

Javascript自诞生以来,曾经没有人拿它当做一门编程语言。在Web 1.0时代,这种脚本语言主要被用来做表单验证和网页特效。直到Web 2.0时代,前端工程师利用它大大提升了网页上的用户体验,JS才被广泛重视起来。在JS逐渐流行的过程中,它大致经历了工具类库、组件库、前端框架、前端应用的变迁。Javascript先天就缺乏一项功能:模块,而CommonJS规范的出现则弥补了这一缺陷。本文将介绍CommonJS规范及Node的模块机制。

在其他高级语言中,Java有类文件,Python有import机制,PHP有include和require。而JS通过<script>标签引入代码的方式显得杂乱无章。过去人们不得不用命名空间等方式来人为地约束代码,直到CommonJS规范的出现,前后端的Javascript才得以实现大一统。Node借鉴了CommonJS的Modules规范实现了一套非常易用的模块系统。

1. CommonJS模块规范

CommonJS的模块规范分为3个部分:

1).模块引用:通过require()方法并传入一个模块标识来引入一个模块的API到当前上下文中,如var math = require('math');2).模块定义:通过exports对象来导出当前模块的方法或变量。模块中还存在一个module对象,exports实际上是module的属性。在Node中,一个文件就是一个模块,模块内的“全局变量”对外都不可见,只有挂载在exports上的属性才是公开的,如exports.add = function() {}; exports.PI = 3.;3).模块标识:实际上就是传递给require()的参数,如上述的'math',它必须是符合camel命名法的字符串,或者是以“.”“..”开头的相对路径或绝对路径,它可以没有文件名后缀“.js”

2. Node模块实现过程

在Node中,模块分为两类:一类是Node本身提供的核心模块,另一类是用户自己编写的文件模块。核心模块有一部分在Node源代码的编译过程中,编译成了二进制文件,在Node启动时核心模块就被直接加载进内存中,所以它的加载速度是最快的。文件模块则是在运行时动态加载,需要经历三个步骤:路径分析,文件定位,编译执行。注意,Node对引入过的模块都会进行缓存,以减少二次引入时的开销,并对相同模块的二次加载都采用最优先从缓存加载的策略。

2.1 路径分析

路径分析主要分析上述提到的模块标识符,主要分为以下几类:

1)、核心模块,如http、fs、path等2)、.或..开始的相对路径文件模块3)、以/开始的绝对路径文件模块4)、自定义文件模块,可能是一个文件或包的形式。Node会根据模块路径数组module.paths来逐个尝试查找目标文件,通常是沿着当前目录逐级向上直到根目录查找名为node_modules的目录,所以这是查找最费时的一种方式。

2.2 文件定位

在路径分析的基础上,文件定位需要注意如下细节:

1)、文件扩展名分析:由于CommonJS规范允许模块标识不填写扩展名,Node会按.js、.json、.node的次序不足扩展名,依次尝试2)、目录分析和包:若通过上述文件扩展名分析后没有查找到对应文件,却得到一个目录,Node会把目录当做一个包来处理

2.3 编译执行

定位到具体文件后,Node会新建一个模块对象,根据路径载入并编译。对于不同的扩展名,载入方法有所不同:

1)、.js文件:通过fs模块同步读取文件并编译执行2)、.node文件:这是用C/C++编写的扩展文件,通过dlopen()方法加载3)、.json文件:通过fs模块同步读取文件,用JSON.parse()解析返回结果4)、其余扩展名文件:都被当做.js文件载入

我们知道每个模块文件中默认都存在着require、exports、module这3个变量,甚至在Node的API文档中,我们知道每个模块还有filename、dirname这2个变量的存在,它们是从何而来的呢?Node的模块又是怎么做到声明的“全局变量”实际上是不会污染到其他模块的?事实上,Node在编译JS模块过程中会对文件内容进行头尾包装。下面是一个JS文件经过头尾包装的例子:

Node.js中的模块机制学习笔记(node.js 模块)

这样每个模块文件之间都进行了作用域隔离,同时require、exports、module等变量也被注入到了模块的上下文当中。这就是Node对CommonJS模块规范的实现。关于C/C++模块及Node核心模块的编译过程较为复杂,不再赘述。

3. 模块调用栈

有必要明确一下Node中各种模块的调用关系,如下图所示:

C/C++内建模块是最底层的模块,属于核心模块,主要提供API给Javascript核心模块和第三方Javascript文件模块调用,实际中几乎不会接触到此类模块。Javascript核心模块主要职责有两种:一种是作为C/C++内建模块的封装层和桥接层供文件模块调用,另一种是纯粹的功能模块,不需要跟底层打交道。文件模块通常由第三方编写,包括普通Javascript模块和C/C++扩展模块。

4. 包与NPM

4.1 包结构

包本质上是一个存档文件(一般为.zip或.tar.gz),安装后解压还原为目录。CommonJS的包规范由包结构和包描述文件两部分组成。一个完全符合CommonJS规范的包结构应包含以下文件:

1).package.json:包描述文件2).bin:存放可执行二进制文件的目录3).lib:存放Javascript代码的目录4).doc:存放文档的目录5).test:存放单元测试用例的目录

4.2 包描述文件

包描述文件是一个JSON文件——package.json,位于包的根目录下,是包的重要组成部分,用于描述包的概况信息。后面要提到的NPM的所有行为都与这个文件的字段息息相关。下面将以知名Web框架express项目的package.json文件为例说明一些常用字段的含义。

1).name:包名2).description:包简介3).version:版本号,需遵照“语义化的版本控制”,参照 package.json说明

4.3 NPM常用功能

NPM(node package manager),通常称为node包管理器。它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。

4.3.1 NPM包安装

Node包的安装分两种:本地安装、全局安装。两者的区别如下:

1).本地安装npm install <package-name>:package会被下载到当前所在目录,也只能在当前目录下使用。2).全局安装npm install -g <package-name>:package会被下载到到特定的系统目录下,安装的package能够在所有目录下使用。

4.3.2 NPM包管理

下面以grunt-cli(grunt命令行工具)为例,列出常用的包管理命令:

1).npm install:安装package.json文件的dependencies和devDependencies字段声明的所有包2).npm install grunt-cli@0.1.9:安装特定版本的grunt-cli3).npm install grunt-contrib-copy --save:安装grunt-contrib-copy,同时保存该依赖到package.json文件4).npm uninstall grunt-cli:卸载包5).npm list:查看安装了哪些包6).npm publish <folder>:发布包

Node.js的特点和应用场景介绍 Node.js应该是当今最火热的技术之一。本文主要介绍Node.js的特点及应用场景。Node.js是一个基于ChromeJavaScript运行时建立的一个平台,用来方便地搭建快速

node.js中的Socket.IO使用实例 1.简介首先是Socket.IO的官方网站:

node.js中Socket.IO的进阶使用技巧 在上一篇博文Socket.IO中,我简要介绍了Socket.IO的基本使用方法并创建了一个简单的聊天室DEMO。本篇在入门篇的基础上,继续探讨Socket.IO的进阶用法。本

标签: node.js 模块

本文链接地址:https://www.jiuchutong.com/biancheng/374230.html 转载请保留说明!

上一篇:Node.js异步I/O学习笔记(nodejs 异步io底层原理)

下一篇:Node.js的特点和应用场景介绍(node.js最主要的特点有哪3个?)

  • 股东向公司借款超过一年不还
  • 公司的货款直接到账吗
  • 事业单位资产划转流程
  • 增值税发票的抵扣联丢了怎么办
  • 申请开红字发票,原蓝字发票要退回来吗
  • 公司改变工资结构变相降工资怎么办
  • 土地使用权入账价值
  • 进口货物付款计入哪个科目?
  • 税收分类编码如何添加
  • 营改增的相关规定
  • 个体户到税务局开普票需要什么手续
  • 收到投资分红要缴纳企业所得税吗?
  • 发票可以开具办公用品吗?
  • 租赁厂房算什么费用
  • 替票和代票的区别是什么
  • 房地产企业不可能没有合同台账
  • 公司自建房产的房产证
  • 关联交易类型有哪些
  • 2019年收入不足6万如何退税
  • 净利润等于未分配利润和盈余公积吗
  • 销项税现金流量表在附表中如何列示
  • 个人租赁汽车给公司怎么开发票
  • 股权转让怎么交个人所得税
  • 利息调整摊销的经济意义
  • 企业处置固定资产怎么纳税
  • windows10开机如何换帐号
  • 查看所有共享文档
  • 印花税未交罚款会怎么样
  • 公司向法人借款有税务风险吗
  • 对公账户一直没有流水怎么办
  • 单位给个人报销计入什么科目
  • 退税有啥影响
  • php 抓取别的网站的内容
  • php多表联合查询
  • 增值税价外费用如何开票
  • 无形资产的确认与计量
  • 本月无销售额,但是有进项,需要认证吗
  • vite首次打开界面加载慢问题/解决
  • pavsrv50.exe - pavsrv50进程管理信息
  • 生产企业一般贸易
  • 境外服务费代扣代缴所得税
  • 用友的应付单和付款单的区别各是什么时候填制
  • chatgpt的多种免费使用方式
  • 应付职工薪酬是负数是什么意思
  • 维修费成本怎么结转
  • php图片代码
  • phpcms模块
  • 私人打款到对公账户要交税吗
  • 请问如何在
  • 老生常谈的近义词
  • 电脑自学网
  • 增值税税目明细
  • 同一控制下企业合并发生的审计费用计入
  • 应付现金股利属于什么账户
  • 小企业会计准则2023电子版
  • sqlplus分页查询
  • 资本公积和盈余公积是什么意思
  • 建筑业挂靠企业所得税如何收取?
  • 处置无形资产净收益计入什么科目
  • 股权转让是否需要全体股东签字
  • 固定资产暂停使用申请怎么写
  • 支付宝可以对公账户转账吗怎么转
  • 账本结转下年怎么划线
  • 一般纳税人劳务税率是多少?
  • 增值税专用发票的税率是多少啊
  • 房地产企业以土地入股如何交纳企业所得税
  • sql提取数据库表中的数据
  • win8.1系统没有wifi怎么办
  • asmproserver.exe是什么进程 asmproserver进程信息查询
  • 如何查看win7激活码能重复使用
  • w10开发者模式
  • win7 64纯净版网页打开出现乱码该怎么办 解决方法介绍
  • win8功能
  • 麒麟linux系统怎么安装软件
  • javascript例题
  • android的游戏
  • JavaScript中的NaN代表什么
  • js prototype constructor
  • 国家税务局总局黑龙江分局
  • 期间费用如何分摊到成本中
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设