学习
实践
活动
工具
TVP
写文章
原创

模块机制

模块机制

CommonJS 规范

CommonJS 规范

模块引用

模块定义

模块标识

规范涵盖了模块

二进制

Buffer

字符集编码

I/O流

进程环境

文件系统

套接字

单元测试

Web服务器网关接口

包管理

Node 的模块实现

模块

核心模块

文件模块

Node对引入过的模块都会进行缓存,以减少二次引入时的开销

Node缓存的是编译和执行之后的对象

模块标识符分析

核心模块

路径形式的文件模块

自定义模块

模块路径分析

Node在定位文件模块的具体文件时制定的查找策略,具体表现为一个路径组成的数组

逐个尝试模块路径中的路径,直到找到目标文件为止

沿路径向上逐级递归,直到根目录下的node_modules目录

文件定位

文件扩展名分析

· Node会按.js、.json、.node的次序补 足扩展名,依次尝试

目录分析和包

· require()通过分析文件扩展名之后,可能没有查找到对应文件,得到一个目录

Node会将目 录当做一个包来处理

模块编译

Node会新建一个模块对 象,然后根据路径载入并编译

.js文件。通过fs模块同步读取文件后编译执行

.node文件。这是用C/C++编写的扩展文件,通过dlopen()方法加载最后编译生成的文件

.json文件。通过fs模块同步读取文件后,用JSON.parse()解析返回结果

其余扩展名文件。它们都被当做.js文件载入

在编译的过程中,Node对获取的JavaScript文件内容进行了头尾包装

(function (exports, require, module, __filename, __dirname) {\n,在尾部添加了\n});

核心模块

核心模块 其实分为C/C++编写的和JavaScript编写的两部分

其中C/C++文件存放在Node项目的src目录下

JavaScript文件存放在lib目录下

1.转存为C/C++代码

Node采用了V8附带的js2c.py工具,将所有内置的JavaScript代码转换 成C++里的数组

2.编译JavaScript核心模块

与文件模块 有区别的地方在于:获取源代码的方式及缓存执行结果的位置

那些由纯C/C++编写的部分统一称为内建模块

1. 内建模块的组织形式

C/C++编写,性能上优于脚本语言

被直接加载进内存中,无需文件定位编译,可直接执行

2. 内建模块的导出

Node在启动时,会生成一个全局变量process,并提供Binding()方法来协助加载内建模块。

C/C++扩展模块

C/C++扩展模块属于文件模块中的一类

一个平台下的.node文件在另一个平台下是无法加载执行的,必须重新编译

前提条件

GYP项目生成工具

V8引擎C++库

libuv库

Node内部库

其他库

模块编写:C/C++扩展模块与内建模块的套路一样,将方法挂载在target对象上,然后通过NODE_MODULE 声明即可

模块编译,在GYP工具的帮助下,编译过程会根据平台不同,分别通过make或vcbuild进行编译

模块加载:require()方法通过解 析标识符、路径分析、文件定位,然后加载执行即可

模块调用栈

JavaScript核心模块

作为C/C++内建模块的封装层和桥接层, 供文件模块调用

纯粹的功能模块

包与 NPM

在模块之外,包和 NPM则是将模块联系起来的一种机制

包结构

是一个存档文件

包描述文件与NPM

用于表达非代码相关的信息,package.json

NPM常用功能

帮助完成了第三方模块的发布、安装和依赖等

可以帮助用户快速安装和管理依赖包

局域NPM

企业搭建自己的NPM仓库

享受到模块开发带来的低耦合和项目组织上的好处

考虑到模块保密性的问题

NPM潜在问题

包的质量

安全性

前后端共用模块

AMD规范是CommonJS模块规范的一个延伸

CMD规范与AMD规范的主要区别在于定义模块和依赖引入的部分

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • Redis 模块机制 - 模块编写篇

    在 Redis 应用中,模块机制是提及得比较少的一个功能,主要是 Redis 的功能基本上能应付各种需求,很少需要自己编写模块来扩展功能的。但有时候我们希望为 ...

    用户7686797
  • 详解Node模块加载机制

    其中,模块标识(Module Identifiers)就是传入require(id)的第一个字符串参数id,例如require('./myModule')中的'...

    ayqy贾杰
  • webpack模块机制浅析【一】

    用户1749219
  • spreadTrading模块事件触发机制

    本文主要介绍了价差交易模块的事件触发机制。感谢‘次第花开’和‘用户名呀’在维恩的派论坛里的分享!

    用Python的交易员
  • 深度阐述Nodejs模块机制

    我们都知道Nodejs遵循的是CommonJS规范,当我们require('moduleA')时,模块是怎么通过名字或者路径获取到模块的呢?首先要聊一下模块引用...

    coder2028
  • npm 模块安装机制简介

    npm 是 Node 的模块管理器,功能极其强大。它是 Node 获得成功的重要原因之一。 ? 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 。 ...

    ruanyf
  • Ryu:模块间通信机制分析

    Ryu是一款非常轻便的SDN控制器,在科研方面得到了广泛的应用。相比其他控制器,受益于Python语言,在Ryu上开发SDN应用的效率要远高于其他控制器。为了解...

    SDNLAB
  • 模块解析机制_TypeScript笔记14

    模块化机制让我们能够把代码拆分成多个模块(文件),而编译时需要知道依赖模块的确切类型,那么首先要找到它(建立模块名到模块文件路径的映射)

    ayqy贾杰
  • 【ue4】【架构】模块机制

    从功能上讲, UE4 对 编辑器(Editor) 和 游戏性(Runtime) 都提供了支持

    duadua
  • Node的模块儿查找机制

    上篇文章主要分享了的一个commonJS规范的问题,那么今天接着昨天的话题继续聊一聊nodejs的模块儿查找机制

    terrence386
  • Ofbiz模块加载机制即创建独立模块(脱离热部署)

    一般我们在ofbiz下的hot-deploy下直接创建模块组件就可以进行访问,但是我觉得文件过多话,就不方便管理,所以我们可以分离出来单独建立一个文件模块...

    cfs
  • Node.js中模块加载机制

    如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件

    Qwe7
  • Node.js中模块加载机制

    星辰_大海
  • Node.js中模块加载机制

    清出于兰
  • 聊聊 Node.js 的模块机制

    前言:模块机制是 Node.js 中非常重要的组成,模块机制使得我们可以以模块化的方式写代码,而不是全部代码都写到一个文件里。我们平时使用的比较多的通过 req...

    theanarkh
  • 深入理解 ES6 模块机制

    腾讯NEXT学位
  • CommonJS、ES6模块加载机制详解

    无论是前端开始后端,总会有很多概念。就拿这个前端模块加载机制来说,随着语言的发展,各种概念。

    前朝楚水
  • commonJS规范及nodejs的模块儿机制

    上篇文章分享了的一个实现小程序的持续集成的问题,小程序的获取用户信息的接口getUserInfo将在2021-04-13号被getUserProfile替代,所...

    terrence386
  • 【CV中的Attention机制】BiSeNet中的FFM模块与ARM模块

    语义分割需要丰富的空间信息和相关大的感受野,目前很多语义分割方法为了达到实时推理的速度选择牺牲空间分辨率,这可能会导致比较差的模型表现。

    BBuf

作者介绍

精选专题

活动推荐

扫码关注腾讯云开发者

领取腾讯云代金券