我是靠谱客的博主 追寻小懒猪,最近开发中收集的这篇文章主要介绍NodeJs-模块与包,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

        • 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区别

  1. 构成区别:

    Js:由ECMAScript引擎、Bom、Dom构成

    NodeJs:由ECMAScript引擎与拓展功能(文件系统、模块、包、操作系统api、网络通讯)构成

  2. 职责区别:

    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个参数requireexportsmodule、(__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() 来引入本地安装的包名。

全局安装

  1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
  2. 可以直接在命令行里使用。
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-模块与包所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部