Node.js基础入门之模块与npm包管理器使用详解

目录
  • require函数
  • 模块分类
  • 第三方模块
    • 1. 安装第三方模块
    • 2. 引入第三方模块
    • 3. 示例测试
  • 系统模块
  • require注意事项
  • exports导出对象
    • 1. exports示例
    • 2. exports注意事项
  • module模块对象
  • package.json包描述文件
    • 1. 什么是package.json ?
    • 2. 如何创建package.json文件?
  • NPM基础
    • 1. 常用npm命令
    • 2. npm 示例
  • cnpm基础
    • 1. 什么是cnpm ?
    • 2. 使用cnpm
  • 控制台输出
    • 1. 控制台常见输出
    • 2. 控制台输出示例
  • Node.js作用域
    • 1. 什么是作用域?
    • 2. 全局变量

经过第一天的学习,对Node.js有了一个初步的认识,今天继续学习Node.js,加以整理并分享,如有不足之处,还请指正。

require函数

作用:在当前模块中加载另外一个模块

语法:require("模块名称")

模块分类

在Node.js中,模块可以分为三大类,如下所示:

1.自定义模块:在项目中编写的具有特定功能的模块就是自定义模块。

  • 当子模块没有暴露数据时,返回空对象,而不是undefined。
  • 引用自定义模块,必须在路径前加./【如:require("./01.js")】,因为Node.js默认不是当前目录,而是node_modules。

2.第三方模块:第三方程序员或公司开发的模块,需要先安装再使用,可以通过NPM包管理器进行安装。

3.系统模块:Node.js自带的系统模块,不需要安装下载,直接引用即可【如:fs,http,url等】。

第三方模块

如果要使用第三方模块,必须要先进行安装,以jQuery为例,如下所示:

1. 安装第三方模块

安装之前,如下所示:

通过安装命令【npm install jquery】进行安装,如下所示:

安装成功后,会自动在程序目录创建node_modules文件夹,如下所示:

2. 引入第三方模块

当安装成功后,在程序中直接引用即可,如下所示:

 var jquery = require("jquery");
 console.log(jquery.toString());

3. 示例测试

在命令行进行测试引用第三方模块,如下所示:

注意:示例之所以报错,是因为jQuery是浏览器端的模块库,所以不支持服务器端调用,本次只是作为调用示例演示。

系统模块

系统模块是Node.js自带的具有特定功能的模块,不需要安装,直接使用即可。以文件模块为例,如下所示:

首先创建一个测试文件test.txt,文件内容如下:

然后通过Node.js自带的fs模块进行调用,如下所示:

 var fs =require("fs");
 fs.readFile("test.txt",function(err,data){
     console.log(data.toString());
 });

测试示例如下所示:

require注意事项

  • 当引入的模块存在错误时,会报错;
  • 当引入的模块路径不存在时,也会报错;
  • 当模块被重复引用是,只会加载一次【因为第一次加载时,会存入缓存区,第二次加载时,会先判断缓存区是否存在,如果存在,则直接赋值】。

关于require加载模块示意图,可参考下图:

exports导出对象

作用:将模块中需要共享给其他模块的数据暴露或导出到引用处。

语法:exports.属性或函数。

1. exports示例

如下示例:公开了一个用户名和sayHi方法到引用处。

 var username="小六公子";
 function sayHi(){
     console.log("hi,小六子");
 }
 exports.username=username;
 exports.sayHi=sayHi;

2. exports注意事项

在使用exports时,注意事项如下:

exports等同于module.exports ,是module.exports的引用,内存地址一致;可通过以下方式进行判断:

exports是一个对象,可以添加属性和方法,但不可以修改exports指向的内容。如下所示:

 exports.sayHi=sayHi;
 exports=sayHi;//此语法是错误的,不能修改指向

module模块对象

在module中最重要的就是exports对象,如下所示:

  • module.exports,是真正的暴露对象,exports只是对它的引用。
  • module.exports.属性=值;
  • module.exports.方法=函数;
  • module.exports=对象或函数;//直接导出对象

module对象的其他属性:

  • module.id 模块的ID,即对象的唯一路径。
  • module.parent 模块的父对象。
  • module.filename,模块的文件名和路径。
  • module.children 子模块,是一个数组类型。
  • module.paths 数组类型。当前模块查找对象的路径列表。

关于module对象具体详细信息如下所示:

package.json包描述文件

NPM【Node Package Manager】是基于Node.js的包管理工具。在Node.js项目中,JS的基本单位是单个文件,但是复杂的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个模块组成的大模块称为包,并把所有子模块放在同一个目录中。组成一个包的所有子模块中,需要有一个入口,入口模块的导出对象被称为包的导出对象。默认包中的入口模块为index.js,也可以在包中新建一个package.json包描述文件,设置main属性为模块的入口。

1. 什么是package.json ?

package.json是node.js项目的包描述文件,以json格式的形式描述项目。以之前安装的jQuery为例,可以查看对应的package.json文件,如下所示:

{
  "_from": "jquery",
  "_id": "jquery@3.6.0",
  "_inBundle": false,
  "_integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==",
  "_location": "/jquery",
  "_phantomChildren": {},
  "_requested": {
    "type": "tag",
    "registry": true,
    "raw": "jquery",
    "name": "jquery",
    "escapedName": "jquery",
    "rawSpec": "",
    "saveSpec": null,
    "fetchSpec": "latest"
  },
  "_requiredBy": [
    "#USER",
    "/"
  ],
  "_resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
  "_shasum": "c72a09f15c1bdce142f49dbf1170bdf8adac2470",
  "_spec": "jquery",
  "_where": "D:\\MyProject\\DemoNodeJs",
  "author": {
    "name": "OpenJS Foundation and other contributors",
    "url": "https://github.com/jquery/jquery/blob/3.6.0/AUTHORS.txt"
  },
  "bugs": {
    "url": "https://github.com/jquery/jquery/issues"
  },
  "bundleDependencies": false,
  "commitplease": {
    "nohook": true,
    "components": [
      "Docs",
      "Tests",
      "Build",
      "Support",
      "Release",
      "Core",
      "Ajax",
      "Attributes",
      "Callbacks",
      "CSS",
      "Data",
      "Deferred",
      "Deprecated",
      "Dimensions",
      "Effects",
      "Event",
      "Manipulation",
      "Offset",
      "Queue",
      "Selector",
      "Serialize",
      "Traversing",
      "Wrap"
    ],
    "markerPattern": "^((clos|fix|resolv)(e[sd]|ing))|^(refs?)",
    "ticketPattern": "^((Closes|Fixes) ([a-zA-Z]{2,}-)[0-9]+)|^(Refs? [^#])"
  },
  "deprecated": false,
  "description": "JavaScript library for DOM operations",
  "devDependencies": {
    "@babel/core": "7.3.3",
    "@babel/plugin-transform-for-of": "7.2.0",
    "commitplease": "3.2.0",
    "core-js": "2.6.5",
    "eslint-config-jquery": "3.0.0",
    "grunt": "1.3.0",
    "grunt-babel": "8.0.0",
    "grunt-cli": "1.3.2",
    "grunt-compare-size": "0.4.2",
    "grunt-contrib-uglify": "3.4.0",
    "grunt-contrib-watch": "1.1.0",
    "grunt-eslint": "22.0.0",
    "grunt-git-authors": "3.2.0",
    "grunt-jsonlint": "1.1.0",
    "grunt-karma": "4.0.0",
    "grunt-newer": "1.3.0",
    "grunt-npmcopy": "0.2.0",
    "gzip-js": "0.3.2",
    "husky": "1.3.1",
    "insight": "0.10.1",
    "jsdom": "13.2.0",
    "karma": "5.2.3",
    "karma-browserstack-launcher": "1.4.0",
    "karma-chrome-launcher": "2.2.0",
    "karma-firefox-launcher": "1.1.0",
    "karma-ie-launcher": "1.0.0",
    "karma-jsdom-launcher": "8.0.2",
    "karma-qunit": "3.0.0",
    "load-grunt-tasks": "5.1.0",
    "native-promise-only": "0.8.1",
    "promises-aplus-tests": "2.1.2",
    "q": "1.5.1",
    "qunit": "2.9.2",
    "raw-body": "2.3.3",
    "requirejs": "2.3.6",
    "sinon": "2.3.7",
    "sizzle": "2.3.6",
    "strip-json-comments": "2.0.1",
    "testswarm": "1.1.2",
    "uglify-js": "3.4.7"
  },
  "homepage": "https://jquery.com",
  "husky": {
    "hooks": {
      "commit-msg": "commitplease .git/COMMIT_EDITMSG",
      "pre-commit": "grunt lint:newer qunit_fixture"
    }
  },
  "keywords": [
    "jquery",
    "javascript",
    "browser",
    "library"
  ],
  "license": "MIT",
  "main": "dist/jquery.js",
  "name": "jquery",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jquery/jquery.git"
  },
  "scripts": {
    "build": "npm install && grunt",
    "jenkins": "npm run test:browserless",
    "start": "grunt watch",
    "test": "npm run test:slim && npm run test:no-deprecated && npm run test:no-sizzle && grunt && grunt test:slow && grunt karma:main && grunt karma:amd",
    "test:amd": "grunt && grunt karma:amd",
    "test:browser": "grunt && grunt karma:main",
    "test:browserless": "grunt && grunt test:slow",
    "test:no-deprecated": "grunt test:prepare && grunt custom:-deprecated && grunt karma:main",
    "test:no-sizzle": "grunt test:prepare && grunt custom:-sizzle && grunt karma:main",
    "test:slim": "grunt test:prepare && grunt custom:slim && grunt karma:main"
  },
  "title": "jQuery",
  "version": "3.6.0"
}

2. 如何创建package.json文件?

在node.js中,可以根据向导进行创建。在命令行,切换目录到程序所在目录,然后输入命令【npm init】即可开启包文件创建向导。如下所示:

根据向导安装步骤依次填写对应信息,经过以上7步,即可创建包文件,创建成功后在程序目录下,如下所示:

{
  "name": "demonode",
  "version": "1.0.0",
  "description": "node示例",
  "main": "index.js",
  "dependencies": {
    "jquery": "^3.6.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "小六公子",
  "license": "MIT"
}

注意:如果创建默认package.json文件,可以采用【npm init -y】命令,一键生成。

NPM基础

1. 常用npm命令

常用的npm命令,如下所示:

  1. 安装命令:通过安装包命令【 npm install 包名称】进行安装指定的第三方包。
  2. 缩写安装命令:通过命令【npm i 包名称】安装指定的第三方包。
  3. 指定版本安装:通过命令【npm i 包名称@verson】安装指定版本的第三方包。默认安装最新版本。
  4. 全局安装:通过命令【npm i 包名称 -g】进行全局安装第三方包,即可应用于所有的项目。默认全局安装目录【C:\Users\登录账号\AppData\Roaming\npm\node_modules】
  5. 安装同时写入依赖列表:通过命令【npm i 包名称 --save】在安装的同时写入包描述文件中的依赖列表中。
  6. 安装同时写入开发时依赖列表:通过命令【npm i 包名称 --save-dev】在安装的同时写入包描述文件中的开发依赖列表中。
  7. 查找包:通过命令【npm serach 包名称】进行查找。
  8. 预览包:通过命令【npm view 包名称】进行预览包的内容。
  9. 卸载包:通过命令【npm uninstall 包名称】进行卸载已安装的包。
  10. 更新包:通过命令【npm update 包名称】更新包。

2. npm 示例

以npm的安装和查找为例,如下所示:

cnpm基础

1. 什么是cnpm ?

npm命令是需要从国外的服务器进行下载和安装,速度会比较慢,所有为了满足国内的应用需要,cnpm应运而生。cnpm是淘宝提供的与npm服务器保持同步更新的软件包镜像。

目前cnpm的网址为【https://npmmirror.com/package/cnpm】,关于cnpm简介,如下所示:

2. 使用cnpm

如果要使用cnpm,可以通过命令进行注册,如下所示:

 npm install -g cnpm --registry=https://registry.npmmirror.com

cnpm命令使用和npm一致,加上c前缀即可。示例如下所示:

控制台输出

1. 控制台常见输出

在Node.js做为服务器端运行时环境,所以控制台输出也是比较常见,如下所示:

  • 在Node.js中,控制台输出有以下几种:
  • console.log(),与浏览器中的用法一致。
  • console.dir() ,输出目录信息。
  • console.error(),错误信息输出。
  • console.time(标识符) 与console.timeEnd(标识符)一起使用,可以计算某段程序的执行时间。
  • console.assert(条件表达式,输出内容);当条件表达式为假时,输出内容。

2. 控制台输出示例

控制台输出的常用语法示例,如下所示:

console.log("我是小六子");
console.dir("我是小六子呀");
console.error("小六子出错了");
console.time("t1");
for(var i=0;i<99999;i++){
    //
}
console.timeEnd("t1");

示例运行截图,如下所示:

Node.js作用域

1. 什么是作用域?

作用域:规定了一个变量和函数可以使用的范围,作用域分为两种:全局作用域,局部作用域【函数作用域】。在Node.js中,一个文件就表示一个模块,模块中使用var定义的变量为局部变量,只能在模块中使用。因为模块在使用时会被Node.js编译为一个函数。

2. 全局变量

如果将数据共享给其他模块,可以通过两种方法:

  • exports.属性或函数 的方式导出。
  • 声明为全局变量。

全局变量,通过【global.属性或函数=值】的方式使用。如下所示:

 var username="小六公子";
 function sayHi(){
     console.log("hi,小六子");
 }
 global.username=username;
 global.sayHi=sayHi;

调用全部变量,如下所示:

 var obj =require("./demo01-1.js");
 console.log(username);
 sayHi();

注意:global关键字在调用时可以省略。使用方式几乎和exports一致。

以上就是Node.js基础入门之模块与npm包管理器使用详解的详细内容,更多关于Node.js模块 npm的资料请关注我们其它相关文章!

(0)

相关推荐

  • node.js使用require()函数加载模块

    详细说明均以写在注释之中,这里就不啰嗦了,小伙伴们自己详细看吧,千万别吧注释当成空气了. 复制代码 代码如下: /*在node中,可以使用require()函数来加载模块.  * require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名.当使用node中提供的模块时,在require函数中只需要指定模块名即可.  * */ //建立一个页面2.js;代码如下 var name="思思博士"; exports.name=name; //建立一个页面1.js;代

  • Node.js中require的工作原理浅析

    几乎所有的Node.js开发人员可以告诉你`require()`函数做什么,但我们又有多少人真正知道它是如何工作的?我们每天都使用它来加载库和模块,但它的行为,对于我们来说反而是一个谜. 出于好奇,我钻研了node的核心代码来找出在引擎下发生了什么事.但这并不是一个单一的功能,我在node的模块系统的找到了module.js.该文件包含一个令人惊讶的强大的且相对陌生的核心模块,控制每个文件的加载,编译和缓存.`require()`,它的横空出世,只是冰山的一角. module.js 复制代码 代

  • node.js中npm包管理工具用法分析

    本文实例讲述了node.js中npm包管理工具用法.分享给大家供大家参考,具体如下: 现在安装node.js,默认就会帮我们装上了npm包管理工具,npm主要用来下载,安装,管理第三方模块. 创建一个包描述文件: npm init [-y] 查看包的信息 npm info <package-name> 查看包的版本信息 npm info <package-name> versions 安装指定的包: npm install <package-name> 默认会安装在当前

  • node.js中的require使用详解

    代码注释里已经描述的非常的清晰,这里就不多废话了,直接奉上代码: 复制代码 代码如下: /*在node中,可以使用require()函数来加载模块.  * require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名.当使用node中提供的模块时,在require函数中只需要指定模块名即可.  * */ //建立一个页面2.js;代码如下 var name="思思博士"; exports.name=name; //建立一个页面1.js;代码如下 var two=

  • Node.js包管理器npm的具体使用

    目录 目的 npm init 与 package.json文件 模块安装与管理 安装模块 查看已安装模块 更新模块 删除模块 npx 模块编译 版本控制 换源 使用 nrm 工具换源 使用 cnpm 代替 npm 总结 目的 目前的Node.js安装包中都带有一个重要的工具 包管理器npm .npm主要有两方面功能:下载管理第三方模块:构建与运行项目.npm使用本身并不复杂,但是在大陆的网络环境下使用并不省心,徒增许多工作量.这篇文章将对相关内容做个说明. npm init 与 package.

  • Node.js中的模块化,npm包管理器详解

    目录 模块化的基本概念 什么是模块化 模块化拆分的好处 Node.js中的模块化 Node.js中模块的分类 加载模块 模块作用域 向外共享模块作用域中的成员 module对象 exports对象 npm与包 包 如何下载包 在项目中安装包的命令 解决下包速度慢的问题 为什么下包速度慢 解决方法一--淘宝NPM镜像服务器 解决方法二--切换npm的下包镜像源 解决方法三--nrm 总结 模块化的基本概念 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程.对于整个

  • Node.js基础入门之模块与npm包管理器使用详解

    目录 require函数 模块分类 第三方模块 1. 安装第三方模块 2. 引入第三方模块 3. 示例测试 系统模块 require注意事项 exports导出对象 1. exports示例 2. exports注意事项 module模块对象 package.json包描述文件 1. 什么是package.json ? 2. 如何创建package.json文件? NPM基础 1. 常用npm命令 2. npm 示例 cnpm基础 1. 什么是cnpm ? 2. 使用cnpm 控制台输出 1.

  • Node.js安装教程和NPM包管理器使用详解

    2009年的JSCOnf大会上,一个叫Ryan Dahl的年轻程序员向人们展示了一个他正在做的项目,一个基于Google V8引擎的JavaScript运行平台,它提供了一套事件循环和低IO的应用程序编程接口(API).和其他的服务端平台不同, JavaScript天生就是事件驱动IO,而这个项目又大大降低了编写事件驱动应用程序的复杂度,因此它很快就以不可思议的速度的成长流行起来,并应用到实际项目中.(Jack:这段翻译的不太靠谱,原文:This project was not like oth

  • Node.js基础入门之path模块,url模块,http模块使用详解

    目录 path模块 1. path模块示例 2. path模块其他方法 url模块 1. 旧的解析方法 2. 新的解析方法 http模块 1. 什么是HTTP协议? 2. HTTP协议约束的细节 3. HTTP请求响应过程 4. http模块get方法 经过前面四天的学习,对Node.js已经有了一个基础的认识,今天继续学习Node.js网络通信编程相关内容,并稍加整理加以分享,如有不足之处,还请指正. path模块 Node.js中,提供了一个path模块,在这个模块中,提供了许多实用的,可被

  • Node.js基础入门之使用方式及模块化详解

    目录 什么是Node.js ? Node.js下载 Node.js和JavaScript的区别 Node.js安装与验证 Node.js使用方式 1. REPL模式 2. 文件模式 Node.js模块化 1. 什么是模块? 2. 模块分类 3. 创建自定义模块 4. 调用自定义模块 5. 模块测试 6. 主模块 7. 模块组成 在这个竞争日益激烈的今天,已经不是一门语言,一项技术走天下的时代了.正所谓艺多不压身,今天开始学习Node.js,学而时习之,不亦乐乎,希望可以借鉴经验,学以致用,如有不

  • Node.js基础入门之缓存区与文件操作详解

    目录 缓存区 1. 什么是缓存区? 2. 创建指定长度的缓存区 3. 通过数组创建缓存区 4. 通过字符串创建缓存区 5. 读写缓存区 6. 复制缓存区 文件操作 1. 异步直接读取 2. 同步直接读取 3. 流式读取 4. 写入文件 5. 流式写入文件 6. 读取文件信息 7. 删除文件 8. 管道 9. 链式流 经过前面三天的学习,Node.js的基础知识已逐渐掌握,今天继续学习缓存区和文件操作,并稍加整理加以分享,如有不足之处,还请指正. 缓存区 1. 什么是缓存区? JavaScript

  • Node.js基础入门之回调函数及异步与同步详解

    目录 回调函数 1. 什么是回调函数? 2. 回调函数实现机制 3. 回调函数用途 4. 回调函数示例 异步与同步 1. 什么是异步与同步? 2. 同步示例 3. 异步示例一 4. 异步示例二 异步的实现 1. 回调函数的同步示例 2. 异步事件示例 3. 异步示例截图 Promise基础 1. 什么是Promise ? 2. Promise特点 3. 异步的缺点 4. Promise保证异步顺序 经过前面两天的学习,已经对Node.js有了一个初步的认识,今天继续学习其他内容,并加以整理分享,

  • js基础之DOM中document对象的常用属性方法详解

    -----引入 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1  document.anchors  返回对文档中所有 Anchor 对象的引用.还有document.links/document.forms/document.images等 2  document.URL       返回当前文档的url 3  document.title       返回当前文档的标题 4  do

  • 浅谈node模块与npm包管理工具

    在Node.js中,以模块为单位划分所有的功能,并且提供了一个完整的模块加载机制,所以我们可以将应用程序划分为各个不同的部分,并且对这些部分进行很好的协同管理.通过将各种可重用代码编写在各种模块中的方法,可以大大减少应用程序的代码量,提高应用程序的开发效率以及应用程序代码的可读性.通过模块加载机制,可以将各种第三方模块引入到我们的应用程序中. 在node.js中,提供npm包管理工具,用于从第三方网站上下载各种Node.js包. 一.模块 1.1 加载模块 在Node.js中,以模块为单位划分所

  • Node.js的npm包管理器基础使用教程

    配置 npm set npm set init-author-name 'Your name' npm set init-author-email 'Your email' npm set init-author-url 'http://yourdomain.com' npm set init-license 'MIT' 上面命令等于为npm init设置了默认值,以后执行npm init的时候,package.json的作者姓名.邮件.主页.许可证字段就会自动写入预设的值.这些信息会存放在用户

随机推荐