前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >模块机制

模块机制

原创
作者头像
李才哥
修改2021-02-26 17:38:08
4270
修改2021-02-26 17:38:08
举报
文章被收录于专栏:李才哥李才哥

模块机制

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 删除。

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CommonJS 规范
    • CommonJS 规范
      • 模块引用
      • 模块定义
      • 模块标识
    • 规范涵盖了模块
      • 二进制
      • Buffer
      • 字符集编码
      • I/O流
      • 进程环境
      • 文件系统
      • 套接字
      • 单元测试
      • Web服务器网关接口
      • 包管理
  • Node 的模块实现
    • 模块
      • 核心模块
      • 文件模块
      • Node对引入过的模块都会进行缓存,以减少二次引入时的开销
    • 模块标识符分析
      • 核心模块
      • 路径形式的文件模块
      • 自定义模块
    • 模块路径分析
      • Node在定位文件模块的具体文件时制定的查找策略,具体表现为一个路径组成的数组
      • 逐个尝试模块路径中的路径,直到找到目标文件为止
      • 沿路径向上逐级递归,直到根目录下的node_modules目录
    • 文件定位
      • 文件扩展名分析
      • 目录分析和包
    • 模块编译
      • 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规范的主要区别在于定义模块和依赖引入的部分
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档