【Node.js】包的结构及发布

0 前言

包的基础使用方法已在【Node.js】基础篇 中讲述,本篇将不再赘述!!!


1 package.json(包管理配置文件)

以下代码片段为package.json基础内容及介绍

javascript 复制代码
{
  "name": "code",    //包名称
  "version": "1.0.0",    //包版本号
  "description": "",    //包的描述
  "main": "index.js",    //包的入口文件
  "scripts": {    //自定义脚本
    ...
  },
  "keywords": [],    //包的关键词
  "author": "",    //包的作者
  "license": "ISC",    //包的许可证
  "dependencies": {    //核心依赖包:开发和项目上线之后都需要用到的包名及版本
    ...
  },
  "devDependencies": {    //开发依赖包:开发时需要用到的包名及版本
    ...
  }
}

2 包的分类

2.1 项目包

那些被安装到项目的node_modules 目录中的包,都是项目包

2.1.1 开发依赖包(devDependencies)

被记录到devDependencies节点中的包,只在开发期间会用到

命令:

-D : --save-dev的简写

CoffeeScript 复制代码
npm i 包名 -D

2.1.2 核心依赖包(dependencies)

被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到

命令:

CoffeeScript 复制代码
npm i 包名

2.2 全局包

在执行npm install 命令时,如果提供了-g参数,则会把包安装为全局包

全局包会被安装到C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下

CoffeeScript 复制代码
npm i 包名 -g

npm uninstall 包名 -g

注意:

① 只有工具性质的包,才有全局安装的必要性,因为它们提供了好用的终端命令

② 判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可


3 下包镜像

默认从国外的https://registry.npmjs.org/下载包

3.1内置镜像命令

CoffeeScript 复制代码
# 查看当前的下包镜像源
npm config get registry

# 切换镜像源(如淘宝)
npm config set registry=https://registry.npm.taobao.org/

缺点:容易输错链接


3.2 nrm工具

CoffeeScript 复制代码
# 通过npm安装nrm并设置为全局可用的工具
npm i nrm -g

# 查看所有可用的镜像源
nrm ls

# 将下包镜像源切换为taobao镜像
nrm use taobao

4 md转html小工具(i5ting_toc)

CoffeeScript 复制代码
# 将 i5ting_toc 安装为全局包
npm i -g i5ting_toc

# 调用 i5ting_toc    -o:转化为自动打开html文件
i5ting_toc -f 要转换的md文件路径 -o

5 开发自己的包

① 新建自定义文件夹,作为包的根目录

② 在该文件夹中,新建如下三个文件:

  • package.json (包管理配置文件)
  • index.js (包的入口文件)
  • README.md (包的说明文档)

5.1 package.json

javascript 复制代码
{
"name": "abc",    //包名
"version": "1.0.0",    //版本号
"main": "index.js",    //入口
"description": "描述内容",    //搜索时的描述内容
"keywords": ["user", "dateFormat", "escape"],    //搜索关键词
"license": "ISC"    //包的许可证,写这种即可
}

5.2 编写自己的包内容

...


5.3 README.md

包根目录中的README.md 文件,是包的使用说明文档

通过它,我们可以事先把包的使用说明,以markdown 的格式写出来,方便用户参考

README 文件中具体写什么内容,没有强制性的要求;

只要能够清晰地把包的作用、用法、注意事项等描述清楚即可

我们所创建的这个包的README.md 文档中,会包含以下6 项内容:

安装方式、导入方式、格式化时间、转义HTML 中的特殊字符、还原HTML 中的特殊字符、开源协议


6 发布包

6.1 注册npm账号

① 访问https://www.npmjs.com/ 网站,点击sign up 按钮,进入注册用户界面

② 填写账号相关的信息:Full Name、Public Email、Username、Password

③ 点击Create an Account 按钮,注册账号

④ 登录邮箱,点击验证链接,进行账号的验证


6.2 登录npm账号

npm 账号注册完成后,可以在终端中执行npm login 命令,依次输入用户名、密码、邮箱后,即可登录成功
注意:在运行npmlogin 命令之前,必须 先把下包的服务器地址切换为npm的官方服务器,

否则会导致发布包失败!


6.3 把包发布到npm上

将终端切换到包的根目录之后,运行npm publish 命令,即可将包发布到npm 上(注意:包名不能雷同)


6.4 删除已发布的包

运行 npm unpublish 包名 --force 命令,即可从npm 删除已发布的包

注意:

① npm unpublish 命令只能删除72 小时以内发布的包

② npm unpublish 删除的包,在24 小时内不允许重复发布

③ 发布包的时候要慎重,尽量不要往npm 上发布没有意义的包!


7 加载机制

7.1 优先从缓存中加载

模块在第一次加载后会被缓存

这也意味着多次调用require() 不会导致模块的代码被执行多次

注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率


7.2 内置模块的加载机制

内置模块是由Node.js 官方提供的模块,内置模块的加载优先级最高

例如,require('fs') 始终返回内置的fs 模块,即使在node_modules 目录下有名字相同的包也叫做fs


7.3 自定义模块的加载机制

使用require() 加载自定义模块时,必须指定以./或../开头的路径标识符

在加载自定义模块时,如果没有指定./ 或../ 这样的路径标识符,则node 会把它当作内置模块或第三方模块进行加载

同时,在使用require() 导入自定义模块时,如果省略了文件的扩展名,则Node.js 会按顺序分别尝试加载以下的文件:

① 按照确切的文件名进行加载

② 补全.js扩展名进行加载

③ 补全.json 扩展名进行加载

④ 补全.node 扩展名进行加载

⑤ 加载失败,终端报错


7.4 第三方模块的加载机制

如果传递给require()的模块标识符不是一个内置模块,也没有以'./' 或'../' 开头,则Node.js 会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块

如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录

例如,假设在'C:\Users\user\project\foo.js' 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:

① C:\Users\user\project\node_modules\tools

② C:\Users\user\node_modules\tools

③ C:\Users\node_modules\tools

④ C:\node_modules\tools


7.5 目录作为模块

当把目录作为模块标识符,传递给require() 进行加载的时候,有三种加载方式:

① 在被加载的目录下查找一个叫做package.json 的文件,并寻找main 属性,作为require() 加载的入口

② 如果目录里没有package.json 文件,或者main 入口不存在或无法解析,则Node.js 将会试图加载目录下的index.js 文件

③ 如果以上两步都失败了,则Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module 'xxx'

相关推荐
web151173602231 小时前
Node.js 完全教程:从入门到精通
node.js
爱学习的小王!7 小时前
nvm安装、管理node多版本以及配置环境变量【保姆级教程】
经验分享·笔记·node.js·vue
(; ̄ェ ̄)。11 小时前
在Nodejs中使用kafka(三)offset偏移量控制策略,数据保存策略
分布式·后端·kafka·node.js
begei17 小时前
nodejs版本管理,使用 nvm 删除node版本,要删除 Node.js 的某个版本详细操作
node.js
小白探索世界欧耶!~17 小时前
npm/pnpm软链接
前端·npm·node.js
柚子味儿的西瓜17 小时前
npm install --legacy-peer-deps和npm install --force的区别
前端·npm·node.js
_advance18 小时前
🚀不用新建后端项目!用 Vite 插件开发 Node 接口的正确姿势
前端·node.js
OpenTiny社区19 小时前
Node.js技术原理分析系列——如何在Node.js中新增一个内置模块
前端·开源·node.js·opentiny
CDwenhuohuo1 天前
使用 NVM 随意切换 Node.js 版本
node.js
随风起舞11 天前
node.js里的bind,apply, call的区别是什么
前端·javascript·node.js