原创

模块机制

模块机制

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规范的主要区别在于定义模块和依赖引入的部分

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    用户7686797
  • webpack模块机制浅析【一】

    用户1749219
  • 深入理解 ES6 模块机制

    腾讯NEXT学位
  • 领读《深入浅出NODEJS》—第二章 模块机制

    领读,领你读,把书的重点提出来。尝试以知识管理、快速阅读的方式来学习。 为什么要写这个类型的文章呢?第一是想要学习NODEJS了,第二是觉得之前写了那么多的学习...

    web前端教室
  • 浅谈 Node.js 模块机制及常见面试问题解答

    Node.js 模块机制采用了 Commonjs 规范,弥补了当前 JavaScript 开发大型应用没有标准的缺陷,类似于 Java 中的类文件,Python...

    用户1462769
  • 浅谈 Node.js 模块机制及常见面试问题解答

    Node.js 模块机制采用了 Commonjs 规范,弥补了当前 JavaScript 开发大型应用没有标准的缺陷,类似于 Java 中的类文件,Python...

    五月君
  • Node.js中模块加载机制

    清出于兰
  • npm 模块安装机制简介

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

    ruanyf
  • 详解Node模块加载机制

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

    ayqy贾杰
  • CommonJS、ES6模块加载机制详解

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

    前朝楚水
  • 模块解析机制_TypeScript笔记14

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

    ayqy贾杰
  • 【npm】详解npm的模块安装机制

    依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm...

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

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

    SDNLAB
  • spreadTrading模块事件触发机制

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

    用Python的交易员
  • 【玩转腾讯云】现代富文本编辑器Quill的模块化机制

    EditorX是DevUI开发的一款好用、易用、功能强大的富文本编辑器,它的底层基于Quill,并对其做了大量扩展,以增强编辑器的能力。

    DevUI团队
  • 深入Node.js的模块加载机制,手写require函数

    模块是Node.js里面一个很基本也很重要的概念,各种原生类库是通过模块提供的,第三方库也是通过模块进行管理和引用的。本文会从基本的模块原理出发,到最后我们会利...

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

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

    cfs
  • Linux内核设备驱动之Linux内核模块加载机制笔记整理

    多个c文件编成一个模块,可以使用xxx-objs这个Makefile中的指令来实现,如下:

    砸漏
  • 《贝佐斯的数字帝国》6 模块5 决策机制:既要质量,更要速度

    自推出以来,Prime会员服务成了亚马逊业务增长的重要引擎。截至2018年底,亚马逊的全球会员已超过1亿。亚马逊会员的平均花费是非会员的2.7倍,而且会员业务已...

    yeedomliu

作者介绍

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券