前端模块化(一)nodeJS中的CommonJS规范

序言

模块化,大家用vuereact等东西,都会接触到像exportsmodule.exportsexportexport defaultrequiredefineimport等等字段,感觉很多人对于这些东西还是分不清,概念非常的模糊,便想着写这么一篇文章,一是帮助自己梳理知识点,二是跟大家一起成长。其中有写得不对的,请及时提出来 ,我及时更正。

刚开始写的时候有些无从下手,一是因为知识点太多,二是因为自己的经验还不足以帮助大家从深层次剖析js的模块化中的区别,以及其实现原理、思想。这是一篇自己的学习笔记整理,我只能带大家了解前端模块化,区分他们并正确的使用他们。

先给大家扔出几条知识:

  • CommonJSNodeJS模块系统具体实现的基石。
  • AMD:异步模块规范,是RequireJS在推广过程中对模块定义的规范化产出的,推崇依赖前置;
  • UMD:兼容AMDcommonJS规范的同时,还兼容全局引用的方式;
  • CMD:是SeaJS 在推广过程中对模块定义的规范化产出的,推崇依赖就近;
  • ES6:ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量;

CommonJS规范

CommonJS官网上写道,它希望js不仅仅可以在浏览器上运行,而是可以在任何地方运行,使其具备开发大型应用的能力。

javascript: not just for browsers any more!

CommonJS定义的模块分为:

  1. 模块引用(require)
  2. 模块定义(exports)
  3. 模块标识(module)

他可以做到:

  • 服务器端JavaScript应用程序
  • 命令行工具
  • 图形界面应用程序
  • 混合应用程序(如,Titanium或Adobe AIR)

CommonJS模块的特点如下

  • 所有代码都运行在模块作用域,不会污染全局作用域。
  • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
  • 模块加载的顺序,按照其在代码中出现的顺序。

先谈一谈包的概念

前面给大家说过,node.js是基于CommonJS的规范实现的,NPM大家一定都很熟悉,它实践了CommonJS的包规范。

包规范

关于包规范,类比于git仓库,我们可以这么理解:

  • git init在当前文件夹中生成了隐藏文件.git,我们把它叫做git仓库
  • npm init命令在当前文件夹中生成了配置文件package.json,它描述了当前这个包,我们管这个文件叫做包(概念不准确,可以这么理解)。

包结构

严格按照CommonJS规范来的话,包的目录应当包含以下文件或目录。

  • package.json:包描述文件,存在于包顶级目录下
  • bin:存放可执行二进制文件的目录
  • lib:存放js代码的目录
  • doc:存放文档的目录
  • test:存放单元测试用例代码的目录

package.json则是一个配置文件,它描述了包的相关信息。

NodeJS模块

既然node.js是基于CommonJS实现的,那么我们先来简单看看NodeJS的模块原理。

最近参加了公司开展的一次培训,结构性思维培养。任何东西都能够进行分类,事物一旦进行分类,更利于大家对此事物的认知,也能方便大家记忆。所以我们先来看看Node的模块分类。

通常分类

先给大家讲讲模块的分类

  • 核心模块

    • 核心模块指的是那些被编译进Node的二进制模块
    • 预置在Node中,提供Node的基本功能,如fs、http、https等。
    • 核心模块使用C/C++实现,外部使用JS封装
  • 第三方模块

    • Node使用NPM(Node Package Manager)安装第三方模块
    • NPM会将模块安装(可以说是下载到)到应用根目录下的node_modules文件夹中
    • 模块加载时,node会先在核心模块文件夹中进行搜索,然后再到node_modules文件夹中进行搜索
  • 文件模块

    • 文件可放在任何位置
    • 加载模块文件时加上路径即可
  • 文件夹模块(后续的nodeJS的加载规则将会详细介绍)

    • Node首先会在该文件夹中搜索package.json文件,

      • 存在,Node便尝试解析它,并加载main属性指定的模块文件
      • 不存在(或者package.json没有定义main属性),Node默认加载该文件夹下的index.js文件(main属性其实NodeJS的一个拓展,CommonJS标准定义中其实并不包括此字段)

估计大家对于文件夹模块概念都比较模糊,它其实相当于一个自定义模块,给大家举一个栗子

猜你喜欢

转载自blog.csdn.net/qq_42483967/article/details/81131253