Node那些事之模块化

什么是模块化开发,及模块化开发的好处

  • 什么是模块化开发: 把一些功能相似的代码,封装到一个单独的文件中去,这些单独抽离出来的代码,就可以提供各类各样好用的功能.这种经过代码功能分割文件的方式就叫作模块化开发.
  • 好处: 保证了每一个文件的功能(职能)单一.须要什么特定的功能,就直接调用某一个特定的模块.这样对未来程序开发和维护都有好处

Node中如何实现模块化开发

在Node中主要经过三个东西实现模块化开发:node

  • module: 表示一个模块,在Node中最多见的模块就是一个一个的JS文件.
  • require: 做用是加载其余模块用的.在一个JS文件中若是想要引用其余JS文件的成员,就须要使用require.
  • exports: 在Node的模块中,若是要这个模块向外暴露一些成员,以供其它JS模块使用,那么就要使用exports

Node中的模块化主要是为了解决JS文件之间的相互依赖关系npm

Node中模块的分类

Node有三部分组成:ECMAScript + 核心API + 第三方包json

核心API

  • 什么是核心API: 由Node官方将一些经常使用的功能模块编译成二进制的执行文件,而后集成到Node的安装包中.在咱们安装完Node以后,也同时安装了这些功能模块.
  • 如何使用核心模块: 使用require("核心模块名称")以下例
const XXX = require("XXX");
复制代码

第三方模块

  • 什么是第三方模块: 除了官方提供的核心模块以外,咱们在平常开发中也许还有一些使用频率很高的功能代码.而这些功能就被一些厉害的团队、我的、公司打包成可复用的模块.并经过NPM官网托管出去,供其余人下载使用.缓存

  • 如何使用第三方模块:bash

    1. 先使用npm下载这个模块.
    2. 使用require导入你所下载的第三方模块.你导入模块的名字就是你安装时的名字.
    3. 经过查阅官方文档,使用你所下载的第三方模块

**注意:**不管是核心模块仍是第三方模块,都是经过 标识符名称 来引用这个模块的.异步

用户模块

  • 什么是用户模块: 本身所写的JS文件,通通属于用户模块
  • 用户模块向外导出成员的两种方式:
    1. 使用global这个全局对象,将你想要导出的成员挂载到这个对象上面.可是这种方法有两个缺陷.
      • 会形成全局变量污染
      • 不知道所引用的成员是谁导出的. 因此通常状况下咱们使用下面这种方式.
    2. 使用exports来导出须要暴露的成员

exports和module.exports

  1. 经过module.exports可使用 . 的形式追加属性,也可使用 = 直接赋值的形式导出成员
  2. exports只能经过 . 的形式追加属性,不能使用 = 直接赋值的形式
  3. 在一个module中,最终向外暴露的成员,以module.exports指向的对象为准.
  4. 在一个module中,不要混合使用module.exportsexports.

Node中的模块加载规则

优先从缓存中加载模块化

  • 加载核心模块: 优先从缓存中加载,若是缓存中没有再去执行加载核心模块
  • 加载本身的模块: 优先从缓存中加载,若是缓存中没有,再去执行加载本身的模块. 用户模块的查找规则: 不过不写后缀名,则先严格按照给定的文件名去查找模块并加载.若是找不到,则按照必定的规则顺序去查找加载带后缀名的同名文件.以下例:
    index -> index.js -> index.json -> index.node
    复制代码
  • 第三方的模块查找规则:
    1. 首先查看项目的跟目录下有没有node_modules这个文件夹.
    2. 查找node_modules文件夹中有没和第三方模块名称一致的文件夹.
    3. 在模块对应的文件夹中,查找有没有package.json这个文件
    4. package.json文件中查找有没有main属性.
    5. 若是有main属性,而且main属性指向的路径存在,那么就尝试加载这个路径指定的文件
    6. 若是package.json文件中,没有main属性,或者main属性指向的路径不存在,或者干脆就没有package.json文件.那么,就会尝试加载模块根目录中的index相关文件:index.js -> index.json -> index.node
    7. 若是在node_modules文件中找不到对应的模块文件夹,或者在项目根目录中就没有node_modules这个文件夹.则会向上一层的文件夹中查找,查找规则同上.
    8. 若是上一层文件夹得目录中也没有找到,则再向上一层文件夹中去找,直到找到当前项目所在的盘符根目录为止.
    9. 若是找到盘符根目录尚未找到,则报错:cannot find module ***

关于模块化

  • Node中的模块化基于common.js,其特色是有所的依赖项同步加载.
  • common.js因为是一个同步加载规范,因此不适合浏览端使用.因而浏览端有了异步模块加载机制AMD规范.
  • 在ES6中已推出了语言规格上的模块化方案.

个人我的网址: wangyiming.infoui

相关文章
相关标签/搜索