在之前的学习中我们使用require()来引入我们需要的包,这其实就是模块化,各模块相互独立,可以通过某种方式引入别的模块。而这些引入方式都是遵循一定的规范的,这就是CommonJS规范。

一、Commonjs规范

目前JS标准定义的API是为了构建基于浏览器的应用程序,没有制定一个用于更广泛的应用程序的标准库。CommonJS规范致力于提供一个类似java、python等语言的标准库,使JS可以开发服务器端应用程序、命令行工具、桌面图形界面应用程序

二、Nodejs中的模块化

Node应用程序由各种模块组成,采用CommomJS模块规范。

1、模块分类

Nodejs中模块分为两类,一类是由Node提供的核心模块;另一类是由用户编写的文件模块。

核心模块

核心模块在Node源代码的编译过程中被编译进了二进制文件。在Node进程启动时,核心模块会被直接加载进内存,所以在引入这些核心模块时,文件定位和编译执行这两步可以省略。并且在路径分析中优先判断,所以它的加载速度是最快的。HTTP模块、URL模块、fs模块都是Node内置的核心模块,可以直接引用。

文件模块

文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速度相比核心模块稍微慢一些,但是用处非常多。这些模块需要我们自己定义,下面我们来看一下自定义模块。

2、自定义模块

我们把公共的功能抽成一个单独的js文件作为一个模块,默认情况下外部是无法访问这个模块里的方法或者属性。如果想让外部访问模块内的属性和方法,必须在模块里通过exports或者module.exports暴露需要被外部访问的属性和方法。

在需要使用这些模块的文件中通过require引入该模块。这样就可以使用这个模块里暴露的属性和方法。

定义模块,暴露属性或方法

//tools.js

var tools = {
name:'Node'
sayHello:function () {
return 'Hello NodeJs';
}
} //暴露属性或方法
//module.exports = tools; exports.add = tools.name;
exports.sayHello = tools.sayHello;

在别的文件里引入模块

//引入自定义模块
var tools = require('./tools'); //使用该模块里暴露的方法
tools.name; // Node
tools.sayHello(); // Hello NodeJs

3、第三方模块

Nodejs中也可以使用第三方模块,Nodejs中第三方模块由包组成,包又包含若干模块,通过包来对一组具有相互依赖关系的模块进行统一管理。

完全符合CommonJs规范的包目录一般包含如下这些文件:

  • package.json:包描述文件
  • bin:用于存放可执行二进制文件的目录
  • lib:用于存放Javascript代码的目录
  • doc:用于存放文档的目录

我们使用npm安装第三方模块

npm install silly-datetime -Save

安装完npm后我们就可以使用这个包了:

var sd = require('silly-datetime');
sd.format(new Date(),'YYYY-MM-DD-HH:mm');

三、npm

1、什么是npm

npm全称Node Package Manager,是Node.js的包管理器。可以使用它在Node.js应用程序中创建、共享和重用模块。

模块就是可重用的代码库。比如用来与数据库交互的模块、支持web开发的模块以及通过web套接字协助通信的模块。

2、使用npm安装模块

安装模块有两种方式:本地安装、全局安装

本地安装

本地安装模块意味着模块会被安装在项目内名为node_modules的文件夹中,而且它只可以在该项目中使用。这是推荐的安装方式。

使用下列命令开始安装模块:

npm install [module_name]

这个命令意思是向服务器发送一个请求,将该模块的最新版本下载到计算机上。当模块下载成功后会有下列语句输出:

module_name@1.2.0 ./node_modules/module_name

这行输出告诉我们模块的名称、版本以及下载的位置。

全局安装

全局安装意味着该模块可在系统的任意地方使用。其他与本地安装一致。与本地安装稍有不同的是全局安装需要加上-g:

npm install [module_name] -g

3、使用模块

要在Node.js应用程序中使用模块,必须将其引入应用程序中,引入方法如下:

var module = require('module');

我们把它赋值给一个变量,以便于在以后使用这个模块。

4、查找模块文档

有时候我们需要查看模块文档,可以使用一下命令:

npm docs [module_name]

这个命令必须在Node.js项目文件夹的根目录下运行,并且该模块已经下载到了node_modules文件夹下。

5、使用package.json指定依赖关系(dependency)

npm允许开发人员使用package.json文件来指定在应用程序中要使用的模块,并且通过单个命令来安装它们:

npm install

这样做的好处有下列三点:

  • 无需一个个安装模块
  • 其他开发人员可以容易的安装你的应用程序
  • 应用程序的依赖存储在单一的地方

一个最小的package.json文件是这样的:

{
"name":"example1",
"version":"0.0.1",
"dependencies":{
"underscore":"~1.2.1"
}
}

(二)Commonjs规范与模块化的更多相关文章

  1. 该如何理解AMD ,CMD,CommonJS规范--javascript模块化加载学习总结

    是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道requi ...

  2. ES6入门十二:Module(模块化)

    webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相 ...

  3. 1. 模块化的引入与导出 (commonJS规范 和ES6规范)

    node组件导出模块 node一般用commonJS规范 可以通过module.exports导出自己写的模块 这样其他的js文件就可以引用并使用这个模块 module.exports = { log ...

  4. Javascript模块化编程(二)AMD规范(规范使用模块)

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊.今天介绍如何规范地使用模块. 七.模块 ...

  5. 模块化规范:AMD规范和CommonJs规范

    为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱 ...

  6. 19 — node 模块化 及 CommonJS规范 — CommonJS 的由来及各组织与 JS 的关系

    ECMAScript  对于不同的环境(运行平台),设计结构,理念,使用方式大相径庭. 1,浏览器 :DOM BOM 2,NodeJS :FS,HTTP 内置模块 :  第三方模块 : 内置模块 3, ...

  7. 模块化CommonJs规范 part1

    CommonJS规范 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 1.概述 Node 应用由模块组成,采用 CommonJS 模块规范. 每个文件就是一个模块, ...

  8. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  9. 关于CommonJS规范摘录

    CommonJS规范 1. 概述 为什么要用commonjs 模块化的目的: 减少循环依赖 减少耦合,提高了模块的复用率 有利于多人开发,提高开发的效率. 规避命名的冲突.全局变量的污染.有利于代码的 ...

随机推荐

  1. [Tunny]Git常用命令与入门

    [黄映焜/Tunny,20140709] Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制..g ...

  2. 用户授权policy

    定义策略类 php artisan make:policy PostPolicy app/Policies/PostPolicy.php public function update(User $us ...

  3. Java集合类工具CollectionUtils的操作方法

    集合判断: 例1: 判断集合是否为空:CollectionUtils.isEmpty(null): trueCollectionUtils.isEmpty(new ArrayList()): true ...

  4. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  5. SqlServer2005使用top 100 PERCENT 无法排序的问题

    由于公司提供的分页控件需要我使用top子句,而且有必要将查询到的记录全部取出,确发现不能排序,sql语句如下: SELECT TOP 15 * FROM( SELECT TOP (100) PERCE ...

  6. http以及http协议简单理解

    HTTP协议是超文本传输协议的缩写,是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议:HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件, 图片文件, 查询结果等)HTTP作 ...

  7. COGS 1. 加法问题 (水体日常)

    这是一个经典的入门问题,通过此问题,你可以学会如何使用该评测系统. [问题描述] 现在有两个实数,分别是A和B.请你从文件中读取A和B,计算它们的和A+B,并把它输出到文件中.(保留到整数) [输入格 ...

  8. qs库 是将url参数和json互转 | query strings 缩写 | import qs from 'qs'

    import qs from 'qs'   1.npm地址 https://www.npmjs.com/package/qs 2.概述 将url中的参数转为对象: 将对象转为url参数形式 3.示例 ...

  9. 【转】《windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  10. web.config中配置数据库连接的两种方式

    在ASP.NET中有两种配置数据库连接代码的方式,它们分别是 appSettings 和 connectionStrings .在使用 appSettings 和 connectionStrings ...