概述
文章目录
- 1.介绍
- 2.Js与NodeJs区别
- 3.CommonJs规范
- 4.NodeJs模块
- 4.1.模块特点
- 4.2.自定义模块
- 4.3.主模块
- 5.NodeJs模块进阶
- 5.1.模块构成
- 5.2.Require函数
- 5.3.exports导出对象
- 5.4.module模块对象
- 5.5.exports与module.exports区别
- 5.6.模块初始化
- 5.7.模块导入
- 5.8.node_modules文件夹
- 6.包
- 7.NPM
- 7.1.Npm安装包
- 7.2.Npm常用命令
- 7.3.CNPM
- 8.NodeJs调试
- 9.NodeJs作用域
1.介绍
NodeJs是用javaScript作为后端服务器的编程语言。
javaScript是一款客户端脚本语言,它的运行环境是基于客户端的,也就是浏览器,NodeJs的由来是将javaScript脱离浏览器的执行环境,使用Google Chrome开源浏览器JavaScript V8引擎为基础搭建了一个新的javaScript执行环境,并且在v8引擎上添加了服务器编程语言该有的功能,如文件系统、模块、包、操作系统api、网络通讯等。
NodeJs = JavaScript执行环境+JavaScript扩展的功能。
简单理解NodeJs就是一个可以让JavaScript脱离浏览器还能执行的平台,并且这个平台对JavaScript功能进行了增强。
2.Js与NodeJs区别
-
构成区别:
Js:由ECMAScript引擎、Bom、Dom构成
NodeJs:由ECMAScript引擎与拓展功能(文件系统、模块、包、操作系统api、网络通讯)构成
-
职责区别:
Js:运行在浏览器客户端中,只要有ECMAScript引擎就能运行,各个浏览器的执行引擎不一样,主要负责操作Bom、Dom
NodeJs:独立的平台,具有服务端语言处理能力,处理网络请求,保存数据到数据库等
3.CommonJs规范
CommonJS API:不是一个语言,也不是一个平台,它只是一个标准(规范)。 它定义的标准主要是对ECMAScript标准API进行增强。目标是提供一个类似Python,Ruby和Java标准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的ECMAScript解释器和不同的主机环境中。
NodeJS是这种规范的实现。
4.NodeJs模块
模块:一个具有特定功能的文件就是一个模块,模块之间可能存在一定的依赖关系,使用模块可以很好的把这些依赖关系整合起来。
模块规范:AMD、CMD、CommonJs(NodeJs)
AMD:AMD (Asynchronous Module Definition=异步模块定义),这种规范是异步的加载模块,requirejs应用了这一规范,适合客户端浏览器环境。
define( id?, dependencies?, factory );
第一个参数 id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。如果存在,那么模块标识必须为顶层的或者一个绝对的标识。
第二个参数,dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。
第三个参数,factory,是一个需要进行实例化的函数或者一个对象。
CMD:CMD (Common Module Definition), 是seajs推崇的规范,国内大牛玉伯之作。
define(factory);
factory,是一个需要进行实例化的函数或者一个对象。
CommonJS:是诞生比较早的。NodeJS就采用了CommonJS的规范来定义模块。但是CommonJs采用的是同步加载文件方式,只适用于服务端(NodeJs平台)
4.1.模块特点
1、模块中使用var定义变量都是局部变量。
2、模块定义在函数,也是局部。
3、模块有一个模块对象。包含moduleId(模块名)、exports(导出对象)
4、如果模块中需要暴露方法或属性给外部使用,那么就执行往exports对象上面添加。
5、使用一个模块用require(“moduleId”),该方法返回的是模块对象的exports对象。
4.2.自定义模块
- 新建js文件,编写js代码,并使用关键字
exports
导出对象,输出模块中的功能供外部使用
var getSum = function (a, b) {
console.log(a + b);
}
exports.getSum = getSum;
- 在另一个js文件中,使用
require
关键字使用模块
//引入模块
var sum = require("./add.js"); // .js可以省略
//使用模块中的功能
sum.getSum(12, 12);
4.3.主模块
通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。例如通过以下命令node main.js
启动程序时,main.js就是主模块。
5.NodeJs模块进阶
5.1.模块构成
一个文件就是一个模块,编写这个模块中的代码,实际上都写在一个函数中,这样就保证了局部变量,模块独立,不会对外部模块造成影响。
在4.2.中自定义模块在调用时会传入5个参数require
、exports
、module
、(__filename
,__dirname
)供定义模块使用。
5.2.Require函数
require(moduleId)函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象,模块文件路径的js后缀可以省略。
被引入的模块分为三种:文件模块、系统模块、第三方模块
注意:
(1)引入模块文件有语法错误时会报错
(2)引入模块不存在时会报错
(3)重复引入模块只执行一次
(4)在require函数引入模块时,可以省略扩展名 .js .json .node 不写。
5.3.exports导出对象
exports对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。
注意:
(1)exports 等同于 module.exports
(2)exports是一个对象,可以对它添加属性和方法
5.4.module模块对象
module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象(module.exports={})。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。模块默认导出对象被替换为一个函数。
module.exports = function () {
console.log('Hello World!');
};
可以直接使用 module.exports 导出属性、方法、类
5.5.exports与module.exports区别
exports仅仅是引用了module.exports. 但是真正暴露的对象为module.exports对象
5.6.模块初始化
一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的(exports)导出对象。之后,缓存起来的导出对象被重复利用。
5.7.模块导入
NodeJs共两种类型的模块:核心模块(系统模块)、文件模块不同类型的模块,导入模块时也有一些差异
-
核心模块:
核心模块,是由NodeJs平台提供的模块,也可以称为“系统模块”。 导入核心模块的规则:不以…或.和/开始的标识符。
-
文件模块:
文件模块,以…或.和/开始的标识符,这里都被当做文件模块来处理
5.8.node_modules文件夹
node_modules文件夹在nodejs中是一个特殊的文件夹,通过它的名字就可以看出,该文件夹也是用于存放node模块。
如果一个模块既不是核心模块又不是文件模块,就会在node_modules文件夹下进行操作。
console.log(module.paths);//node_modules会查找的目录。
F:vsProjectdemojs>node main.js
[ 'F:\vsProject\demo\js\node_modules',
'F:\vsProject\demo\node_modules',
'F:\vsProject\node_modules',
'F:\node_modules' ]
可以发现: 沿路径向上逐级递归查找,直到根目录下的node_modules目录。
6.包
JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。
组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。
默认包中的入口模块为index.js,也可以在包中新建一个package.json包描述文件,设置main属性值为模块的入口。
package.json
{
main:”./hello.js” //模块的入口
}
package.json构成:
name - 包名。
version - 包的版本号。
description - 包的描述。
homepage - 包的官网 url 。
author - 包的作者姓名。
contributors - 包的其他贡献者姓名。
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。(模块也会依赖其他模块。)
repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上(代码仓库 , git,svn版本控制工具)。
main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require(“express”)。
keywords - 关键字,发布到npm后,供其他人搜索。
7.NPM
Npm(Node Package Manager): Node包(模块)管理工具,借助NPM,可以帮助用户快速安装和管理依赖包,这样我们就可以很方便的使用来自全球Node开发者提供的包了。
7.1.Npm安装包
npm 安装 Node.js 模块语法格式如下:
npm install <Module Name>
以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require(‘express’) 的方式就好,无需指定第三方包路径。
var express = require(‘express’);
全局安装与本地安装
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如:
npm install express
# 本地安装
npm install express -g
# 全局安装
本地安装:
本地安装
1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
2. 可以通过 require() 来引入本地安装的包名。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
7.2.Npm常用命令
npm init 会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm install <name>安装nodejs的依赖包
npm install <name> -g 将包安装到全局环境中
npm install <name> --save 安装的同时,将信息写入package.json中
npm remove <name>移除
npm update <name>更新
npm view <name> versions 查看可用版本
如果全局安装的包不能使用,就必须将全局安装目录加入到环境变量中。
NODE_PATH => C:UsersadminAppDataRoamingnpmnode_modules
7.3.CNPM
在我们中国,要下载 npm 包非常慢,如果使用 cnpm 下载包就非常快了。
CNPM是taobao提供的一个完整 npmjs.org 镜像,cnpm与npm的内容每10分钟会同步一次。
安装cnpm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
使用cnpm:
cnpm install <模块名>
8.NodeJs调试
console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台。不过Node中的控制台输出至CMD窗口。Node.js中,可以通过console对象的各种方法向控制台中输出内容。
使用方式:
- 进入cmd模式
- 键入Node进入Node模式
- 执行命令
//普通输出
console.log("hello itsource");
//错误输出
console.error("错误消息");
//time(flag) 与 timeEnd(flag) 统计一段代码的执行时间,注意time、timeEnd的flag需一致
console.time("t1");
for(var i=0;i<1000;i++){
console.log("hehe");
}
console.timeEnd("t1");
//assert(表达式,"文本消息") 断言:表达式如果为真
console.assert(3>10,"断言失败,条件不成立");
9.NodeJs作用域
作用域:规定了一个变量和函数可使用的范围,作用域分为两种:全局作用域、局部作用域(函数作用域)
- NodeJs局部作用域
NodeJs中一个文件就是一个模块,模块中使用var定义的变量为局部作用域,只能在该模块中使用,因为模块在使用时会把NodeJs编译为一个函数,那么使用var的定义的变量,理所当然的只能在这个模块(函数)中使用。
比如:某模块我们编写了以下代码
var a = 10;
NodeJs会在执行之前,编译这个模块为:
function (exports, require, module, __filename, __dirname) {
var a = 10;// a为局部变量
}
- NodeJs全局作用域
NodeJs定义一个变量,如果是不使用var,而直接给变量赋值,那么就是一个全局变量,一个全局变量可以被其他模块所使用。
username = "admin";
NodeJs中的全局对象为global,所以通过给这个对象上面添加属性,也是全局变量。
global.username = "admin"
最后
以上就是追寻小懒猪为你收集整理的NodeJs-模块与包的全部内容,希望文章能够帮你解决NodeJs-模块与包所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复