# js 模块化编程发展的过程

  • 模块化开发的优点:
    • 开发效率高
    • 代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发类似的功能
    • 可维护性高
    • 软件的生命周期中最长的阶段其实不是开发阶段,而是维护阶段,需求变更比较频繁,使用模块化开发方式更容易维护

# 一、演变历程

  • 当我们还在用 jq 写代码的时候,为了写一个模块通常是小组成员之间约定需要复用某一个功能,需要

# 1.全局函数

funciton dateForm(date){
    ...
    return date
}
1
2
3
4

# 2.对象封装-命令空间

var utils={}
utils.add=function(a,b){
    return a+b
}
1
2
3
4

# 3.公有私有成员分离

# 4.增强可维护可扩展性

# 5.添加第三方依赖

# 二、规范化标准

# 1.CMD (sea.js)

# 2.AMD(requireJS)

# commonJS

前言

模块化的目的是解决大型项目中多人协作的问题

# 1.js 模块化的不足

  • JS 没有模块系统,不支持封闭的作用域和依赖管理
  • 没有标准库,没有文件系统和 io 流 api
  • 没有包管理系统

# 2.CommonJS 规范

  • 封装功能
  • 封装作用域
  • 可能解决依赖问题
  • 工作效率更高,重构方便

# 3.Node 中的 CommonJS

  • 在 node.js 里,模块划分所有的功能,每个 JS 都是一个模块
  • 实现 require 方法,npm 实现了模块的自动加载和安装依赖
;(function (exports, require, module, __filename, __dirname) {
  exports = module.exports = {}
  exports.name = "zfpx"
  exports = { name: "zfpx" }
  return module.exports
})
1
2
3
4
5
6

# 4.模块分类

# 4.1 原生模块

httppathfsutilevents编译成二进制,加载速度最快,原来模块通过名称加载

# 4.2 文件模块

在硬盘的某个位置,加载速度非常慢,文件模块通过名称或路径来加载文件模块的后缀有三种

  • 后缀名为.js 的 JavaScript 脚本文件,需要先读入内存再运行
  • 后缀名为.json 的 JSON 文件,fs 读入内存转化为 JSON 对象
  • 后缀名为.node 的经过编译后的二进制 C/C++扩展模块文件,可以直接使用

    提示

    一般自己写的通过路径来加载,别人写的通过名称去当前目录或全局 node_modules 下面去找

# 4.3 第三方模块

  • 如果 require 函数只指定名称则视为 node_modules 下面加载文件,这样的话可以移动模块而不需要修改引用的模块路径
  • 第三方模块查询包括 module.paths 和全局目录

# 4.3.1 . 全局目录

window 如果在环境变量中设置了 NODE_PATH 变量,并将变量设置为一个有效的磁盘目录,require 在本地找不到此模块时向在此目录下找这个模块。 UNIX 操作系统中会从 $HOME/.node_modules $HOME/.node_libraries 目录下寻找

# 4.4 模块的加载策略

# 4.5 文件模块查找规则

# 5.外部访问内部

  • 使用 exports 对象
  • 使用 module.exports 导出引用类型

# 6.模块对象属性

  • module.id
  • module.filename
  • module.loaded
  • module.parent
  • module.children
  • module.paths

# 7.包

在 Node.js 中,可以通过包来对一组具有相互依赖关系的模块进行统一管理,通过包可以把某个独立功能封装起来,每个项目的根目录下面,一般都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是项目所需的运行和开发环境。

项目 描述
name 项目名称
version 版本号
description 项目描述
keywords: {Array} 关键词,便于用户搜索到我们的项目
homepage 项目 url 主页
bugs 项目问题反馈的 Url 或 email 配置
license 项目许可证
author,contributors 作者和贡献者
main 主文件
bin 项目用到的可执行文件配置
repository 项目代码存放地方
scripts 声明一系列 npm 脚本指令
dependencies 项目在生产环境中依赖的包
devDependencies 项目在生产环境中依赖的包
peerDependencies 应用运行依赖的宿主包

package.json

# 8.npm

  • 安装完 node 之后只能使用 node 语言特性及核心函数,我们还需要一个系统下载、安装和管理第三方模块
  • 在 node 里这个系统被称为 node 包管理器(Node Package Manager,NPM)

# 8.1 npm 提供给的功能

  • 公共注册服务,用户可以把自己写的包上传到服务器上
  • 命令行下载工具,用户可以通过 npm 命令吧别人写的包下载到自己电脑上,还可以管理自己模块依赖的其他模块

搜索第三方包的地址

https://www.npmjs.com/search
1

# 9.yarn