本规范致力于描述一类可以同时适用于客户端和服务器端的模块系统。该系统中的模块拥有自己的作用域,可以从其他模块导入单例对象,或者对外提供 API。

Require

require 是一个函数对象。

  1. require 函数接受一个称为模块标识符的参数。
  2. require 函数返回外部模块提供的 API。
  3. 当发生循环依赖时,一个外部模块被其依赖模块导入时,它可能未被完全执行。在此种情况下,当前模块调用 require 函数所返回的对象必须包含该外部模块已经准备好的输出物。
  4. 如果不能返回所请求的模块,则 require 函数应该抛出异常。
  5. require 函数可以有一个 main 属性。
    1. 当属性 main 存在,它应该是只读的且不能删除。
    2. main 属性应该是 undefined,或是已加载模块的 module 对象。
  6. require 函数可以有一个 paths 属性,该属性是一个具有优先秩序的路径数组,优先级从高到低,路径一直回溯到顶级模块目录
    1. paths 属性不应存在于沙盒中。
    2. 所有模块中的 paths 属性应该一致
    3. 使用另一个对象替换 paths 对象是无效的。
    4. 如果 paths 属性存在,修改 paths 内容会对模块搜索行为产生影响。
    5. 如果 paths 属性存在,它所包含的路径可能不是全部的搜索路径。因为加载器可以能会在搜索 paths 提供的路径之前或之后去检查其它的路径。
    6. 如果 paths 属性存在,加载器责任去解析、标准化、规范化路径

模块上下文

  1. 一个模块中只有一个自由变量 require,该变量符合以上对 require 函数的定义。
  2. 一个模块中只有一个自由变量 exports,当模块被执行时,该模块对外提供的 API 被添加到该 exports 对象上。
    1. 模块必须使用 exports 对象作为唯一的输出手段。
  3. 一个模块中应该包含一个自由变量 module,该变量是一个 Object 对象。
    1. module 对象应该拥有一个 id 属性,它是模块的顶级属性。当执行 require(module.id) 时,返回 module.id 所属模块的输出对象。如果该属性被实现,则它应该是一个只读属性,不能删除。
    2. module 对象可以有一个 uri 属性,该属性指向模块源文件。uri 属性不应存在于沙盒中。

模块标识符

  1. 模块标识符是一个由多个词汇组成的字符串,不同词汇之间使用正斜杠分隔。
  2. 单个词汇应该是驼峰标识符,...
  3. 模块标识符不能包含文件后缀名,例如 .js
  4. 模块标识符可以是相对的,也可以是顶级的。如果标识符首个单词是 ...,那么该标识符就是相对的。
  5. 顶级标识符是相对于所谓根命名空间而言。
  6. 相对标识符是相对于 require 函数所处的模块而言。

未说明

本规范有以下重要点未说明:

  1. 模块是否存储于数据库、文件系统或工厂函数中,又或者可以和链接库进行互换
  2. 模块加载器是否支持使用 PATH 环境变量来解析模块标识符。

PS:本规范从 CommonJS 官方英文版本转译而来,斜体部分表示译文存在商榷。

Ref:

CommonJS Module 1.1.1

CommonJS 模块规范 1.1.1的更多相关文章

  1. CommonJs模块规范

    1.什么是模块化 文件作用域 通信规则 加载 require 导出 exports 2.CommonJs模块规范 在Node中的Javascript还有一个很重要的概念:模块概念 模块作用域 使用re ...

  2. NodeJs的CommonJS模块规范

    前言 本人记忆力一般,为了让自己理解<深入浅出Node.js-朴灵>一书,会在博客里记录一些关键知识,以后忘了也可以在这里找到,快速回想起来 Node通过require.exports.m ...

  3. "浏览器端" 使用 commonjs 模块规范开发网页应用,像开发 node 那样开发网页应用

    Containjs 1.0 Containjs 是什么? Containjs 是一个基于 Commonjs 模块管理规范的 浏览器端 的 JavaScript 模块加载器(目前为非标准的,代码会持续迭 ...

  4. commonJS模块规范 和 es6模块规范 区别

    ES6 模块与 CommonJS 模块的差异 CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用. CommonJS 模块是运行时加载,ES6 模块是编译时输出接口. Commo ...

  5. 理解CommonJS ,AMD ,CMD, 模块规范

    参考 : https://blog.csdn.net/xcymorningsun/article/details/52709608 1.CommonJS 模块规范 (同步加载模块): var math ...

  6. CommonJs模块化(nodejs模块规范)

    1.概述: Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. 如果想在多个 ...

  7. Node.js实战项目学习系列(3) CommonJS 模块化规范

    前言 想开始编写Node.js代码,那么我们就必须先熟悉它的模块化规范CommonJS,本文将详细讲解CommonJS规范 本文代码 >>> github 地址 CommonJS N ...

  8. Node基础-CommonJS模块化规范

    1.在本地项目中基于NPM/YARN安装第三方模块 第一步:在本地项目中创建一个"package.json"的文件 作用:把当前项目所有依赖的第三方模块信息(包含:模块名称以及版本 ...

  9. 浅析JS中的模块规范(CommonJS,AMD,CMD)

    如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧,这些规范到底是啥东西,干嘛的. 一.CommonJS ...

随机推荐

  1. Leetcode 67 Add Binary 大数加法+字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  2. UHF桌面式发卡器

    UHF桌面式发卡器: http://www.rr-rfid.com/index.php/pro_view/95  本文用菊子曰发布

  3. Avizo应用 - Home和Set Home

    Avizo的数据展示区域中两个选项Home和Set Home,如下图: 接下来会通过一套岩心的数据处理,解释一下这两个选项的一个用处. 首先这个数据已经完成了过滤处理,体渲染效果如下: 然后进行数据分 ...

  4. Android Studio导入github下载的工程

    现在从github上面现在的项目大部分都是Android Studio工程,那么问题来了,从github上面down一个工程下来,怎么导入android studio呢? 对刚从eclipse转And ...

  5. MySQL 学习用employee数据库表参考使用

    download place:https://launchpad.net/test-db/ ,choose this file from the right panel:employees_db-fu ...

  6. Android UI系列-----时间、日期、Toasts和进度条Dialog

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  7. Qt 实现遥感图像显示时的连动效果

    遥感图像处理时少不了ENVI,用过ENVI的人都知道,打开图像时或图像处理完后,在缩略图上移动鼠标时,鼠标周围的图像信息会在大的视图中实时的显示,即大图会跟着小图中的鼠标移动,这即是图像的连动效果.如 ...

  8. web跨域解决方案

    阅读目录 什么是跨域 常用的几种跨域处理方法: 跨域的原理解析及实现方法 总结 摘要:跨域问题,无论是面试还是平时的工作中,都会遇到,本文总结处理跨域问题的几种方法以及其原理,也让自己搞懂这方面的知识 ...

  9. 你可能不知道的python

    1.如何循环获得下标,使用 enumerate ints = ['a','b','c','d','e','f'] for idx, val in enumerate(ints): print idx, ...

  10. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...