02、node.js

本文详细介绍了Node.js的模块化概念,包括模块化的基本介绍、发展历史、常见模块化规范如CommonJS,以及如何自定义模块。同时,深入探讨了require的加载机制,并讲解了npm包的管理,包括npm的使用、包的分类、安装与使用、镜像源切换。此外,还提供了一个完整的npm包从创建到发布的案例,涵盖了初始化项目、编写功能、发布到npm的全过程。
摘要由CSDN通过智能技术生成

目录

1、模块化

1.1、模块化基本介绍

问:什么是模块化?

问:不支持模块化有什么问题?

1.2、模块化的发展

1.3、体验几种模块化写法

1.4、模块化规范

1.4.1、commonJS规范来   自定义模块

1.4.2、自定义模块的要点

1.4.3、拓展:导出模块的两种方式

2、require 的加载机制

2.1、require加载规则

3、npm - 包 - 模块

3.1、npm 

3.2、npm集中管理包

3.3、npm下载使用包

3.4、npm镜像

3.5、包的分类

 3.5.1、安装全局包和项目包

3.5.2、全局安装 nrm 包

4、案例:npm包从创建到发布

【第一步】: npm 项目初始化

【第二步】:完成功能开发

【第三步】:切换镜像源  ---> npm 官网

【第四步】:链接 npm  ----> npm adduser

【第五步】:把包上传到npm  ---> npm publish 





学习目标:

了解几种模块化

体验几种模块化的写法

掌握在node.js中定义导出模快

学会下载使用包




学习内容:

1、 掌握npm下载使用包
2、
通过命令来配置镜像




学习产出:

1、 技术笔记 1 遍
2、CSDN 技术博客 1 篇


1、模块化

1.1、模块化基本介绍

模块是对功能相似的函数或属性的封装。例如:

  • fs 模块中封装了一系列文件操作的函数。例如:fs.readFile()fs.writeFile()
  • path 模块中封装了一系列路径处理的函数。例如:path.join()path.basename()

模块的好处:提高了函数的复用性!

问:什么是模块化?

答:一个js文件可以引入其他的js文件,能使用引入的js文件的中的变量、数据,这种特性就称为模块化。nodejs是支持模块化的。

ES5 中不支持模块化 :

通过index.html 先后引入tool.js 和 index.js ,让index.js中的getData 去使用tool.js中的doSomething() 。index.js 不能直接使用tool.js 的函数,要通过index.html 过渡。

补充: ES6之前 js没有模块化的功能

问:不支持模块化有什么问题?

答:变量污染,代码无法维护


1.2、模块化的发展

发展历程:

  1. ES6之前(ES5),不支持模块化,我们借用第三方库实现 模块化。
  2. ES6之后,ES6原生语法支持模块化,浏览器不直接支持模块化(需要单独设置)。Node.js内部支持模块化,与ES6模块化有些许不同。

第三方库:


1.3、体验几种模块化写法

参考网址:LABjs、RequireJS、SeaJS 哪个最好用?为什么? - 知乎

  • node.js 模块化
  • ES6 模块化
  • sea.js
  • require.js

1.4、模块化规范

模块化规范:拆分模块和组合模块时,所遵守的规则

例如:在 Node.js 中,导入其它模块时,统一使用 require() 函数。

//导入fs 模块

const fs = require('fs')

//导入 path 模块

const path = require('path')

常见的模块化规范:

  • CommonJS 规范:nodejs中遵守的就是commonjs规范。
  • ES6 模块化规范:(前后端通用的模块化规范;Node.js、Vue、React 中都能使用!)
  • CMD 和 AMD 模块化规范(较少使用): CMD----> sea.js ;  AMD----> require.js 。
  • UMD 叫做通用模块定义规范(Universal Module Definition),它可以通过运行时或者编译时让同一个代码模块在使用 CommonJs、CMD 甚至是 AMD 的项目中运行。它没有自己专有的规范,是集结了 CommonJs、CMD、AMD 的规范于一身。

学习模块化规范,知道怎么导入并使用别人的模块,知道怎么封装模块给别人使用。

1.4.1、commonJS规范来   自定义模块

自定义模块使用场景

  • 在项目中重复使用代码
  • 代码提供给别人使用
  • 代码封装成模块有利于优化代码结构,方便后期维护与扩展

自定义模块步骤:遵循 CommonJS 的模块化规范:(在Node.js 中定义模块 )

  1. 定义模块,创建一个js文件。
  2. 导入模块,使用  require( '自定义模块的路径') 函数
  3. 使用模块,完成具体的功能。(另一个需要使用模块的 js 文件)。
  4. 导出模块,使用 module.exports = { } 向外共享成员。

注意:每个 .js 文件,都是一个独立的模块,模块内的成员私有。

 user.js模块:

//01、user.js
const username = '小朱'
function show() {
    console.log('你好!我是 ' + username );
}
module.exports = {
    show
}

 测试导出模块:

//02、test.js
const res = require('./01、user.js')
console.log('导入的内容是:', res);
res.show()

终端运行结果: 

PS C:\Users\QYWF\Desktop\********\Day02node.js> node .\02、test.js
导入的内容是: { show: [Function: show] }
你好!我是 小朱

1.4.2、自定义模块的要点

  1. 一般用 模块名命名文件,比如:模块叫myModule,则这个js文件最好叫myModule.js
  2. 避免与核心模块命名冲突,比如:自定义模块名 不能叫 fs.js
  3. 导入模块的路径是相对路径
  4. 导入之后,记得console.log(‘变量’) 
  5. 记得导出
  6. module.exports 是固定写法,一般放在文件的最末尾,也只用一次。
  7. module.exports  表示当前模块要暴露给其它模块的功能
  8. module.exports 可以导出对象、数组、函数等类型。为了方便组织代码,多 导出 对象 {}。
  9. 不必要导出所有函数,对象,数组等

1.4.3、拓展:导出模块的两种方式

 参考 node.js导出模块

  • exports
  • module.exports
// 定义方法,常量
const myPI = 3.14
const add = (a,b) => a + b;

// 导出,两种方法任意都可以
// 方法一:
exports.myPI = myPI
exports.add = add

// 方法二:
module.exports.myPI = myPI
module.exports.add = add

// 方法二(变形)
module.exports  = {
    myPI,
    add
}

初始 exportsmodule.exports 是指向同一块内存区域,其内容都是一个空对象{}。

在引入某模块时:以该模块代码中  module.exports 指向的内容为准。

​建议直接使用module.exports 。

2、require 的加载机制

以如下代码为例:

// moudule1.js
var a = 1;
var b = 2;
console.log(a+b);
var c = a+b;
module.exports = {
	data: c
}

在index.js中使用模块:

// index.js
const obj = require('./moudule1.js');
console.log(obj);

//这里的obj对象就是moudule1.js中的module.exports对象

2.1、require加载规则

  1. require 优先加载缓存中的模块。同一个模块第一次require之后,就会缓存一份,下一次require时就直接从缓存中去取
  2. 如果是加载核心模块,直接从内存中加载,并缓存。 const xxx = require("模块名") 。不能写相对路径!
  3. 如果是相对路径,则根据路径加载自定义模块,并缓存。
  4. 如果不是自定义模块,也不是核心模块,则加载第三方模块

加载自定义模块:以 require('./main')为例,先加载 main.js,如果没有再加载 main.json,如果没有再加载 main.node(c/c++编写的模块),找不到就报错。

加载第三方模块:以require('XXX')为例,node 会去本级 node_modules 目录下的xxx文件夹中找,找到就缓存。

①查找第三方模块文件夹xxx下的 package.json 文件

②查找 main 属性,并加载 main 属性所指向的模块

③如果 main 属性不存在,则尝试加载名为 index.js 的模块

④如果 index.js 加载失败,报错

如果找不到,node 则取上一级目录中的node_modules下找 , node_modules/xxx 目录,规则同上

如果一直找到代码文件的文件系统的根目录还找不到,则报错:模块没有找到。

可以通过console.log(module.paths)来观察查找路径

3、npm - 包 - 模块

3.1、npm 

  1. npm :  Node Package Manager(node 包管理器),是为了解决 Node 中第三方包共享的问题。
  2. npm 不需要单独安装。在安装Node的时候,会连带一起安装npm
  3. npm -v检查安装的情况。
  4. 官网  npm
  5. 命令行工具。安装node时,已自动安装。
  6. npm网站是第三方模块的"超市",可自由下载,上传模块。

3.2、npm集中管理包

npm网站下载需要的代码时,代码是以"" 的结构放在 npm 网站上的。

3.3、npm下载使用包

启动终端(项目根目录下地址栏输入cmd打开小黑窗):

  1.  初始化项目。npm init        创建的项目文件夹避免中文命名 , 初始化会在根目录下生成一个package.json文件,记录了当前项目的基本信息。

  2. 安装包。 npm install xx包名xx

  3. 引入模块,使用   const 常量名 = require('包名')

//第一步:初始化项目
npm init --yes
// 或者是 npm init -y    此 init 命令用来在根目录下生成一个package.json文件
//第二步:安装第三方包  比如项目中使用 对日期时间的处理可以安装dayjs包 
//                        网站:https://dayjs.fenxianglu.cn/

npm install dayjs

//第三步:使用包

// 从npm下载 别人写的好代码,在本地引入,并使用
const dayjs = require('dayjs')
console.log(dayjs);
console.log( dayjs().format('YYYY-MM-DD') );  //2000-1-1

1、npm init 命令         //   init 初始化

  • 启动一个交互式的程序,可填入一些关于本项目的信息,生成一个package.json文件(可手动修改) 。
  • 如果想要 直接采用默认信息,使用 npm init --yes            // 或者是 npm init -y
  • npm init 命令只需要运行一次,若项目根目录下已有package.json文件,则省略初始化命令步骤。

2、package.json 文件

  • package.json文件 :由npm init命令创建出来,整体内容是一个json字符串用来对当前项目进行整体描述,
  • 下面列举一些package.json文件里的内容:

name: 表示项目的名字;

main : 入口文件, require(包名)   ‘./xxxx.js’  指向的文件 。先去找这个文件;

version:版本号;

keywords:关键字;

author:作者;

descrption:描述。

其他参考:1.package.json文件 -- JavaScript 标准参考教程(alpha)

                  2.package.json | npm 安装文档

package-lock.json文件:对包的 来源,版本做锁定。

3、node_modules文件夹

从npm网站下载包  (npm install xxx),到这个node_modules文件夹中。此文件夹存放从npm中下载来的第三方包。

  1. 如果有package.json

    (1) 修改package.json文件。根据开发依赖生产依赖的不同,决定把 修改 记录 加在 devDependencies 或者是 dependencies 列表中。

    (2) 修改node_modules文件夹 。

    1. 如果有node_modules文件夹,直接在文件夹里面新建 名为XXX 的文件夹,并从npm中下来这个xxx包。如果这个包还有其它的依赖,则也会下载下来。

    2. 如果没有node_modules文件夹,则先创建这个文件夹,再去下载相应的包

  2. 如果没有package.json。会给一个警告信息。

3.4、npm镜像

默认情况下,从npm官方下载,网速比较慢;我们可以去它的镜像网站上来下载。

# 设置镜像为  taobao。
npm config set registry https://registry.npm.taobao.org
# 设置镜像为  npm官方
npm config set registry https://registry.npmjs.org
# 查看配置
npm config get registry 

3.5、包的分类

 3.5.1、安装全局包和项目包

把包从npm的官网(或者是指定的镜像源)下载到我们自己的电脑中。(通过npm install 命令 )

  • 全局安装: 包 被安装到了系统目录(一般在系统盘node_modules中)。

    全局安装的包一般可提供直接执行的命令。我们通过对一些工具类的包采用这种方式安装,如:

    gulp, nodemon, live-server, nrm等。

// `npm install -g 包名`  或者  `npm install 包名 -g`

npm install -g  xxx

npm root -g           // 查看全局包的安装目录

//C:\Users\QYWF\AppData\Roaming\npm\node_modules


npm list -g --depth 0 // 查看全局安装过的包
  • 项目安装(本地安装):包安装在当前项目的根目录下(与package.json同级)的node_modules中。命令:npm install 包名   。本地安装的包是与具体的项目有关的, 我们需要在开发过程中使用这些具体的功能。
  • 要用到该包的命令执行任务的就需要全局安装
  • 要通过require引入使用的就需要本地安装-项目包。

3.5.2、全局安装 nrm

nrm 这个工具是帮助我们切换npm镜像源的。

# 设置镜像为taobao。
npm config set registry https://registry.npm.taobao.org
# 设置镜像为npm官方
npm config set registry https://registry.npmjs.org

使用nrm之后,就可以简化上面的命令。

步骤:

// 第一步: 全局安装 
npm install nrm -g

// 第二步:列出所有的源信息      // (*)标注的就是当前使用的源
nrm ls

// 第三步:根据需要切换源        // 例如:指定使用taobao镜像源
nrm use taotao



C:\Users\QYWF\Desktop\myprojject>nrm ls

* npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
  taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/


C:\Users\QYWF\Desktop\myprojject>nrm use taobao


   Registry has been set to: https://registry.npm.taobao.org/


C:\Users\QYWF\Desktop\myprojject>nrm ls

  npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
* taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/

// 接下来,正常安装你需要的包

nrm ls 报错 参考:https://blog.csdn.net/LQCV587/article/details/113884507

3.5.3、开发依赖和生产依赖

  1. 保存到开发依赖(devDependencies),通过这种方式安装的包出会现在package.json文件中的devDependencies字段中。
    npm install 包名 --save-dev
    // 或者 npm install 包名 -D
  2. 保存到生产依赖(dependencies):
    npm install 包名
    // 或者 npm install 包名 -save
    // 或者 npm install 包名 -S
  • 加了-D : 开发依赖,这就表示这个工具包只在开发项目时候要用,项目开发完成就不需要

  • 不加-D: 生产依赖,这就表示这个工具包在项目做完了之后也要用。

4、案例:npm包从创建到发布

【第一步】: npm 项目初始化

在本地磁盘上创建一个空项目,取文件夹名为myProject136。

新建文件夹 命名  myTools-136  ===> 包名 自定义

注意请先去npm网官去确定一下,项目名是否已经被占用了。(如果这个名字已经被占用了,则你是无法向npm上上传的)。 

npm view 包名     //npm view myTools-136  
# 这个命令用来查看 某个包的信息
# 如果返回404,说明这个项目名在npm官网上找不到,此时你就可以使用
# 否则,说明不可用。

C:\Users\QYWF\Desktop\myProject136>npm view myTools-136
npm ERR! code E404
npm ERR! 404 'myTools-136' is not in the npm registry.
npm ERR! 404 name can no longer contain capital letters
npm ERR! 404
npm ERR! 404  'myTools-136@latest' is not in the npm registry.
npm ERR! 404 Your package name is not valid, because
npm ERR! 404  1. name can no longer contain capital letters
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\QYWF\AppData\Roaming\npm-cache\_logs\2021-09-12T11_30_15_333Z-debug.log
npm init --yes
//命令来创建一个package.json文件,对你项目 xxx  信息进行设置

【第二步】:完成功能开发

新建index.js 、tools.js 文件,写自己的代码,在默认情况下,index.js是这个项目的入口文件。

//tools.js
const relativeTime = (oldTime) => {
  const t = new Date(oldTime)
  // Date.now():现在的时间戳(毫秒)
  // t.getTime():旧时间的时间戳(毫秒)

  const diff = Date.now() - t.getTime() // 相隔多少毫秒
  // Math.floor 向下取整: 1.7年 ---> 1年前
  const year = Math.floor(diff / (1000 * 3600 * 24 * 365))
  if (year) {
    return `${year}年前`
  }
  const month = Math.floor(diff / (1000 * 3600 * 24 * 30))
  if (month) {
    return `${month}月前`
  }
  const day = Math.floor(diff / (1000 * 3600 * 24))
  if (day) {
    return `${day}天前`
  }
  const hour = Math.floor(diff / (1000 * 3600))
  if (hour) {
    return `${hour}小时前`
  }
  const minute = Math.floor(diff / (1000 * 60))
  if (minute) {
    return `${minute}分钟前`
  } else {
    return '刚刚'
  }
}

const formatDate = (dateTime) => {
  // console.log(date)
  // date = new Date();
  const date = new Date(dateTime) // 转换成Data();
  console.log(date)
  var y = date.getFullYear()
  console.log(y)
  var m = date.getMonth() + 1
  m = m < 10 ? '0' + m : m
  var d = date.getDate()
  d = d < 10 ? ('0' + d) : d
  return y + '-' + m + '-' + d
}



// 通过module.exports来导出模块
module.exports = {
  formatDate,
  relativeTime
};

【第三步】:切换镜像源  ---> npm 官网

把包上传到npm上,所以要先确保当前的 npm 源是npmjs.org

(1)查看当前的npm的registry配置.

npm config get registry 
# 查看当前的npm的registry配置,确保是https://registry.npmjs.org

# 如果不是,可以通过如下命令来设置
npm config set registry https://registry.npmjs.org 
# 手动设置registry

C:\Users\QYWF\Desktop\myProject136\myTools-136>npm config get registry
https://registry.npm.taobao.org/

C:\Users\QYWF\Desktop\myProject136\myTools-136>npm config set registry https://registry.npmjs.org

(2)或者使用 nrm 工具来设置:nrm ls 查看镜像源  nrm use  npm 

C:\Users\QYWF\Desktop\myProject136\myTools-136>nrm ls

  npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
* taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/


C:\Users\QYWF\Desktop\myProject136\myTools-136>nrm use npm


   Registry has been set to: https://registry.npmjs.org/


C:\Users\QYWF\Desktop\myProject136\myTools-136>nrm ls

* npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
  taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/

【第四步】:链接 npm  ----> npm adduser

npm adduser  命令需要输入三个信息以供连接上npmjs:

  • 用户名

  • 密码

  • 邮箱(是你在npmjs官网上注册时使用的信息)

C:\Users\QYWF\Desktop\myProject136\myTools-136>npm adduser
Username: xiao***chen
Password:
Email: (this IS public) 22....1241@qq.com
Logged in as xiaozhuchen on https://registry.npmjs.org/.

C:\Users\QYWF\Desktop\myProject136\myTools-136>npm who am i
xiao***chen

可以通过如下命令检查自己是否连接成功了,npm who am i

如果成功了,则可以进行最后一步了:publish

如果想退出:          npm logout

【第五步】:把包上传到npm  ---> npm publish 


C:\Users\QYWF\Desktop\myProject136\myTools-136>npm publish
npm notice
npm notice package: myTools-136@1.0.0
npm notice === Tarball Contents ===
npm notice 308B  index.js
npm notice 1.4kB tools.js
npm notice 225B  package.json
npm notice === Tarball Details ===
npm notice name:          myTools-136                        
npm notice version:       1.0.0                              
npm notice package size:  1.1 kB                             
npm notice unpacked size: 1.9 kB                             
npm notice shasum:        27c8ebba27b67d094b3ea719de95487cfa23d371
npm notice integrity:     sha512-imrvLNv4gtwT9[...]/+obqHDJ3De3Q==
npm notice total files:   3                                  
npm notice

出错的可能是:

  • 这个包名被别人先用了。

  • 包的版本号不对:每次publish时,包的版本号都应该要大于之前的版本号。

  • 文件过大。你可能需要创建.npmignore文件来设置在打包时要忽略哪些文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值