npm学习笔记

ES标准的缺陷

  • 没有模块系统
  • 标准库较少
  • 没有标准接口
  • 缺乏管理系统

CommonJS对模块的定义

  1. 模块引用

    • 在node中,通过require()函数来引入外部的模块
      • require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,若使用相对路径,必须以.或..开头
      • 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
  2. 模块定义

    • 在Node中,一个js文件就是一个模块
      • 每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
      • 可以通过exports来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为exports的属性即可
        • eg.exports.x="我是x";
      • 导入模块后,会在导入位置执行导入模块中的代码,只是被导入模块的大部分变量和方法不可见(还有少部分暴露的变量和方法可见)
  3. 模块标识

    • 我们使用require()引入外部模块时,传入的参数就是模块标识(),我们可以通过模块标识来找到指定的模块。

模块分类

  • 核心模块
    • 由node引擎提供的模块
    • 核心模块的标识就是模块的名字
  • 文件模块
    • 由用户自己创建的模块
    • 文件模块的标识就是文件的路径

CommonJS包规范

CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。CommonJS的包规范由包结构和包描述文件两个部分组成。

  • 包结构

    • 用于组织包中的各种文件
  • 包描述文件

    • 描述包的相关信息,以供外部读取分析

包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件。

  • package.json 描述文件
  • bin 可执行二进制文件
  • lib js代码
  • doc 文档
  • test 单元测试

注意:json文件不能写注释

模块化过程

当node在执行模块中的代码时,他会首先在代码的最顶部,添加如下代码:

function (exports,require,module,__filename,__dirname)

实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参

  • exports

    • 该对象用来将变量或函数暴露到外部
  • require

    • 函数,用来引入外部模块
  • module

    • module代表的是当前模块本身
  • __filename

    • 当前模块的完整路径
  • __dirname

    • 当前模块所在文件夹的完整路径

注意exports和module.exports的区别

exports只是一个局部变量,其值为module.exports,即

exports=module.exports

涨知识

在node中有一个全局对象global,它的作用和网页中window类似

​ 在全局中创建的变量都会作为global的 属性保存

​ 在全局中创建的函数都会作为global的方法保存

上一篇:Node.js(3)— 模块和包 及其创建和使用


下一篇:小程序的模块化