node.js的模块化介绍

1. 模块化介绍

1.1. 由于JavaScript不是一个模块化语言,存在两大缺陷:

a、文件中的代码会造成全局污染;

b、 依赖的加载顺序无法完全保证,例如jquery插件要在引入jquery后引入。

1.2.  Node中的模块化:

a、 文件天生就是一个私有的作用域

b、 文件与文件之间通过特定的规则进行交互(导入导出)

c、  程序最终由n个文件组成整个应用程序

d、 在每个模块内部,module代表当前模块,这个对象有一个属性exports,通过require函数加载这个模块,其实就是在加载某个模块,也就是该模块的module.exports接口。

2. Node中的模块分类

2.1. 核心模块https://nodejs.org/en/docs/

就是node中的内置模块,例如fs,http等,其加载速度最快,因为已经被编译到node程序中了,每个模块都提供了一个唯一的核心标识名称,所以加载规则都一样

Var 变量名=require(‘核心模块名’)

1.2.  第三方模块

第三方模块就是由社区提供的模块(通常是npm),有将近35万个之多,通过在使用的时候都遵循以下三步:

a、 通过 npm 下载到项目中;

b、 通过 require 函数加载下载的第三方模块;

c、 查阅第三方模块的文档;

以marked为例(提供将markdown格式字符串转为HTML格式字符串的功能)

a、npm install marked

b、var marked = require(‘marked’)

c、console.log(marked(‘# hello world’))

d、输出结果为:<h1>hello world</h1>

1.3.  用户自定义模块

用户模块就是用户自己编写的文件模块,通常是一个文件或者多个文件组成。

例如以下简单的加减功能

在cal.js文件中

function add(x,y){

  return x+y;

};

function minus(x,y){

  return x-y;

}

module.exports.add=add;

module.exports.minus=minus;

在app.js文件中

var cal = require(‘./cal)

2.4.模块化特点总结

a、所有代码都运行在模块作用域,不会污染全局作用域

b、模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存起来了,以后再加载,就直接读取缓存结果

c、模块加载的顺序,按照其在代码中出现的顺序

d、 module.exports 是模块的对外导出接口,其它文件加载该模块,实际上就是读取 module.exports

通过 require 函数加载别的模块,加载模块的过程实际上就是执行被加载模块中的代码,得到被加载模块的 module.exports 接口对象

3. exports和module.exports

为了方便,Node为每个模块提供了一个 exports 属性,指向 module.exports ,也就是说可以通过修改 exports 从而修改 module.exports

3.1. 如果需要向外只导出一个变量、例如一个函数、字符串、数字等,则必须通过为 module.exports 赋值才可以。

注意:为 exports 赋值是不管用的,因为每个模块最终对外到处的接口是 module.exports,而 exports 只是 module.exports 的一个引用,所以一旦给 exports 赋值,就切断了两者之间的引用关系,赋的值也就不管用了。

总结:如果希望向往导出多个接口成员,则可以使用 exports 添加属性成员方便的对外导出。

但是如果想要向外部提供一个单一的字符串、函数、数组等接口数据,则必须通过为 module.exports 赋值。(给 exports 赋值是不管用的)。

4. require 函数加载模块规则流程

require 函数接收的值被称作模块标识符,可能是一个核心模块标识名,也可能是一个第三方模块,也可能是一个相对路径形式的文件路径。在指定文件模块的时候,可以省略文件名后缀,当省略了文档名后缀之后,node 会以 .js、.node、.json 依次尝试补足。

下面是详细的加载规则:

4.1. 优先从缓存加载

4.2. 标识符分析

a、如果是核心模块,直接加载

b、如果是用户模块,即以 ./ 或者 ../ 开始的标识符或者绝对路径形式的模块,则直接加载

c、如果是第三方模块,则相对于当前模块找 node_modules 目录

d、找到 node_modules 目录之后,找与被加载模块同名的目录

e、如果找到,则找 package.json 文件,如果找到 package.json 文件,则找文件的 main 属性,如果找到 main 属性,则直接加载

f、如果没有 package.json 文件或者没有 main 属性或者 main 属性指定的文件模块不存在,则默认加载该目录中的 index.js、index.node、index.json

g、以上条件任何一个不成立,则直接进入上一级目录找 node_modules 目录,规则同上,直到找到当前文件模块所属磁盘根目录如果还找不到,则直接报错:can not find module xxx

时间: 2024-08-01 03:08:38

node.js的模块化介绍的相关文章

为什么我要用 Node.js? 案例逐一介绍

介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端,这样巨大的反差让人难以想象,因为仅仅在几年前 Javascript 还如同 Flash 或者 Java applet 那样嵌入网页在沙箱环境中运行. 在深入Node.js之前,你可能需要阅读和了解使用跨栈式JavaScript(JavaScript across the stack)带来的好处,它统

[转]为什么我要用 Node.js? 案例逐一介绍

原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端,这样巨大的反差让人难以想象,因为仅仅在几年前 Javascript 还如同 Flash 或者 Java applet 那样嵌入网页在沙箱环境中运行. 在深入Node.js之前,你可能需要阅读和了解使用跨栈式JavaScript(

node.js ----NPM使用介绍

NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用. 由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了.同样可以通过输入 "npm -v" 来测试是否成功安装.命令如下,出现版本提示表示安装成功: $

【转】为什么我要用 Node.js? 案例逐一介绍

原文转自:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端,这样巨大的反差让人难以想象,因为仅仅在几年前 Javascript 还如同 Flash 或者 Java applet 那样嵌入网页在沙箱环境中运行. 在深入Node.js之前,你可能需要阅读和了解使用跨栈式JavaScript(

node.js的模块化开发

node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. 传统非模块化开发的缺点:1.命名冲突   2.文件依赖 标准的模块化规范: 1.AMD -requirejs 2.CMD- seajs 模块化的规范定义的一些写代码的规则,只要遵循了同样的标准,基本上风格都是一致的 服务端的模块化规范: 1.Common.js  -Node.js 模块化相关的规则: 1.一个js文件 都是一个独立的模块,模块内部的成员都是相互独立的 2.模块化的导入和导出 案例1(ex

SharePoint Online 开发篇:node.js和npm介绍和安装部署

Blog链接:https://blog.51cto.com/13969817 过去的几年中,出现的最重要的开发平台是Node.js和基于npm的开发,SharePoint Framework是这种开发方法的一个示例,本文我们来了解下Node.js.npm和Node Package Manager 是什么? Node.js,是一个建立在Google Chrome JavaScript的引擎(V8引擎)上的服务器端平台.JavaScript引擎的性能已经提高了很多,取决于你在做什么,事实上,它们的性

Node.js的有关介绍

今天我们来简单了解一下Node.js的相关内容 首先要了解Node.js是一个基于Chrome V8引擎的 JavaScript 运行环境: Node.js使用了一个简单事件驱动 非阻塞式 I/O 的模型,使其轻量又高效: Node.js 的包管理器npm(Node Package Manage),是全球最大的开源库生态系统. REPL(交互式解释器) REPL(Read Eval Print Loop:交互式解释器),表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux

vue学习【第三篇】:vue之node.js的简单介绍

什么是node.js 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 安装node.js node.js的特性 - 非阻塞IO模型 - 时间驱动 运用的场景 - 高并发低业务 - 实时场景 - 聊天.电子商务.视频直播等 安装地址 http://nodejs.cn/ 判断是否安装成功 node -v 进入编辑状态:node+回车,可以进行一些运算 退出编辑模式:ctrl+d或者ctrl+c两次 npm是一个包管理器,其实是一个命令.使

node.js 的模块化

模块的概念 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块加载系统. 在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),换言之,一个 Node.js 文件就是一个模块 模块是Node.js 应用程序的基本组成部分,每个模块都有自己的作用域 在 Node中,模块分为两类 一类是 Node 提供的模块,称为核心模块:另一类是用户编写的模块,称为文件模块. 核心模块部分在 Node 源代码的编译过程中,编译进了二进制执行文件.在 Node 进