Node 模块

Node.js 的模块可以是 JavaScript文件、JSON文件,还可以是变异过的C/C++文件,可以被引用、创建和自定义。

系统模块

通过 Node.js 官方 API 可以看到 Node.js 自身带有很多系统模块,这些系统模块被编译成二进制文件,可以用 require 语句去获取,核心模块具有最高的加载优先级。

  • Buffer 用于实现二进制数据的存储和转换
  • Cluster 用于实现多进程
  • Console 用于控制台输出信息
  • Crypto 用于实现数据的加密解密处理
  • Events 用于为事件处理提供基础类
  • Fs 用于操作文件及文件系统
  • Http 用于实现 http 服务
  • Net 用于实现 TCP 服务
  • OS 用于获取操作系统信息
  • Util 用于实现各种使用函数
  • Zlib 用于实现压缩和解压

创建和加载模块

Node.js饿模块创建方式非常简单,创建一个 JavaScript 文件,然后用 exports 或者 module.exports 导出模块。模块中可以多次使用 exports 导出属性或者函数,但是 module.exports 只能导出一次属性或者函数。exports 相当于在导出对象上挂属性,modules.exports 相当于给导出对象重新赋值。

引用模块使用 require 函数需要遵循如下规则:

  1. 引用相同目录下的模块,路径要以 ./ 开头,文件的后缀名可以忽略。
  2. require 函数不支持通配符表达式
  3. require 函数可以卸载任何需要的地方,不必是文件的开头部分
  4. 引用系统模块不用写路径和后缀名
  • 使用 exports 导出

user.js

let username = "Jax";
exports.username = username;

let sayHello = () => console.log('hello');
exports.sayHello = sayHello;

index.js

let user = require('./user.js');
console.log(user.username);
user.sayHello();
  • 使用 module.exports 导出

user.js

let username = "Jax";
exports.username = username;

let sayHello = () => console.log('hello');
exports.sayHello = sayHello;

module.exports = {
  username: "Jax",
  sayHello: () => console.log('hello')
}

index.js

let user = require('./user.js');
console.log(user.username);
user.sayHello();

外部模块(包)

在 Node.js 中,包和模块并没有本质的不同,包是模块的基础上更深一步的抽象,包将某个独立的功能封装起来,用于发布、更新、依赖管理和进行版本控制。包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,相当于提供一些固定接口的函数库。

每个项目的根目录下面,一般都会有package.json文件,定义了这个项目中所需各种模板及项目中的配置信息。主要有以下参数:

  • name:项目名称
  • deecription:应用项目描述
  • version 版本号
  • config:应用的配置项
  • author:作者
  • respository:资源仓库地址
  • licenses:授权方式
  • main:应用入口文件
  • dependencries:项目应用运行依赖模块
  • devDependencies:项目应用开发环境依赖

完整配置如下:


{
  //项目名称
  "name": "demo",
  //版本号(遵守“主版本.次要版本.补丁号”的格式
  "version": "1.0.0",
  //description描述你的模块,或者搜索
  "description": "vue.js js iview ",
  //main字段指定了加载的入口文件,即主文件
  "main": "app.js",
  // scripts指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm start时,所要执行的命令。
  "scripts": {
    "start": "node index.js"
  },
  //repository(仓库)指定一个代码存放地址
  "repository": {
    "type": "git",
    "url": "git+https://github.com/XXXX"
  },
  //作者
  "author": "mayuan",
  //授权方式
  "license": "MIT",
  //指明node.js运行所需要的版本
  "engines": {
      "node": "0.10.x"
  },
  "bugs": {
      "url": "https://github.com/XXXX"
  },
  // 一个字符串数组,方便别人搜索到本模块
  "keywords": [
  "vue","iview"
  ],
 
  //devDependencies指定项目开发所需要的模块
  "devDependencies": {
      "babel-core": "^6.23.1",
      "babel-loader": "^6.3.2",
      "babel-preset-es2015": "^6.22.0",
      "vue-html-loader": "^1.0.0",
      "vue-loader": "^8.5.2",
      "vue-style-loader": "^1.0.0",
      "webpack": "^1.13.2"
  },
  //dependencies字段指定了项目运行所依赖的模块
  "dependencies": {
      "express": "latest", //指定express是最新版本
      "mongoose": "~3.8.3",
      "handlebars-runtime": "~1.0.12",
      "express3-handlebars": "~0.5.0",
      "MD5": "~1.2.0"
  }
}

npm 是随同 Node.js 一起安装的包管理工具。以下是一些常用的 npm 命令:

  • 查看版本号
npm -v
  • 创建包管理的描述文件 package.json
npm init
  • 依据 package.json 下载项目所依赖的包
npm install
  • 下载全局依赖包,全局包不仅仅可以在当前项目使用,还可以在整个本机上使用
npm install <packageName> -g

# 全局安装有可能会出现没有权限的情况就要加 sudo
sudo npm install <packageName> -g
  • 在当前项目下载依赖包
# 下载了在 package.json 不会有记录
npm install <packageName>

# 在 package.json 的 dependencies 属性中有记录
npm install <packageName> --save

# 在 package.json 的 devDependencies 属性中有记录
npm install <packageName> --save-dev
  • 使用淘宝镜像
sudo npm install cnpm -g

然后使用 cnpm 替代 npm 使用