1、包
第三方模块,第三方免费提供下载,包是基于内置模块封装出来的
2、包的操作
https://www.npmjs.com/ :全球最大的包共享平台
https://registry.npmjs.org/ :包共享服务器,提供下载
-
如何下载
npm包管理工具:Node.js已经集成
npm -v:查看npm版本
-
在项目中安装指定名称的包(默认下载最新版本的包)
npm install 包的完整名称
简写:npm i 包的完整名称
安装指定版本的包:npm i 包的完整名称@版本号
-
导入包时,导入时的名称为下载时的名称
-
初次装包多的文件
node_modules:存放所有已安装到项目中的包
package-lock.json:json格式的配置文件,记录每个包的下相关信息
-
包的语义化规范
第一位数字:大版本(重构时+1)
第二位数字:功能版本(功能调整+1)
第三位数字:Bug修复版本(修复Bug+1)
提升规则:只要前面的版本号增长了,则后面的版本号归零
3、包管理配置文件,项目根目录,package.json
(1)记录项目中安装的包:package.json
- 在项目开发过程中,上传代码时,一定要将node_modules文件夹剔除
(2)快速在所处的目录中创建package.json
——npm init -y
- 项目名称中不要出现空格,不要出现中文
(3)package.json中的dependencies节点:专门用来记录安装的包
(4)一次性安装所有的包:在剔除node_modules的项目中执行npm install
,简写npm i
(执行过程中,会读取dependencies节点,读取到包名和版本号,就会将涉及到的包进行安装)
(5)卸载包:npm uninstall 包名
(卸载后包从node_modules文件夹中自动删除,package.json文件也会自动修改)
4、devDependencies节点
如果某些包只在开发时使用,安装到devDependencies节点中:
npm i 包名 -D
完整写法 :npm install 包名 --save--dev
5、切换npm的下包镜像源
// 查看当前的下包镜像源
npm config get registry
// 将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
// 查看修改之后的镜像源
npm config get registry
6、nrm快速查看和切换镜像源
// 将nrm安装为全局可用
npm i nrm -g
// 查看所有的镜像源
nrm ls
// 将下包的奖项源切换为taobao镜像
nrm use taobao
7、包的分类
核心依赖包(npm i 包名
)
开发依赖包(npm i 包名 -D
)
全局包(npm i 包名 -g
):工具性质包才有全局安装的必要性
8、规范的包结构
必须以单独的目录存在
顶级目录下必须包括package.json文件
package.json中必须包括name(名称), version(版本号),main(入口文件)三个属性
9、开发属于自己的包
功能:
格式化日期
转义HTML中的特殊字符
还原HTML中的特殊字符
(1)初始化包结构
> * 新建包的根目录test,以及在其中新建`package.json(配置文件)`,`index.js(入口文件)`,`README.md(说明文档)`
>
> * package.json
>
>
> ```js
> {
> "name": "tools-yin", // 包名
> "version": "1.0.0", // 版本号
> "main": "index.js", // 入口文件
> "description": "提供格式化事件,转义左右尖括号", // 描述信息
> "keywords": [], // 搜索关键字
> "license": "ISC" // 开源许可协议
> }
> ```
> * main属性的作用:导入模块时,会自动查找入口文件进行使用
(2)包结构中的src文件夹
// dateFormat.js
function dateFormat(dateStr) {
const dt = new Date(dateStr)
const y = padZero(dt.getFullYear())
const m = padZero(dt.getMonth() + 1)
const d = padZero(dt.getDate())
const hh = padZero(dt.getHours())
const mm = padZero(dt.getMinutes())
const ss = padZero(dt.getSeconds())
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}
function padZero(n) {
return n > 9 ? n : '0' + n
}
module.exports = {
dateFormat
}
// htmlEscape.js
function htmlEscape(htmlStr) {
return htmlStr.replace(/<|>|"|&/g, match => {
switch (match) {
case '<':
return '<'
case '>':
return '>'
case '"':
return '"'
case '&':
return '&'
}
})
}
function htmlUnEscape(str) {
return str.replace(/<|>|"|&/g, match => {
switch (match) {
case '<':
return '<'
case '>':
return '>'
case '"':
return '"'
case '&':
return '&'
}
})
}
module.exports = {
htmlEscape,
htmlUnEscape
}
(3)包的入口文件
// index.js
const date = require('./src/dateFormat')
const escape = require('./src/htmlEscape')
module.exports = {
...date,
...escape
}
(4)在其它地方使用
// test.js(和tools-yin文件夹同级)
const tool = require('./tools-yin')
const dt = tool.dateFormat(new Date())
console.log(dt);
const h = '<h1 title="abc">h1标签<span>123 </span></h1>'
const str = tool.htmlEscape(h)
console.log(str);
const htmlStr = tool.htmlUnEscape(str)
console.log(htmlStr)
(5)编写包的说明文档(README.md)
(6)发布包
-
现在终端登录npm账号:必须在npm环境下,而不是淘宝镜像
-
npm publish:必须处于包的根目录下
-
npm unpublished 包名 --force
10、模块的加载机制
(1)优先从缓存中加载:
(2)内置模块的加载优先级是最高的:即使其它模块和内置模块重名,优先加载内置模块
(3)加载自定义模块时:
-
必须要使用./或者../开头的路径标识符
-
在加载模块时,如果省略了文件的扩展名,Node.js会按顺序分别尝试加载:
1.按照确切的文件名进行加载
2.补全.js扩展名进行加载
3.补全.json扩展名进行加载
4.补全.node扩展名进行加载
5.找文件夹(同名目录)
6.加载失败,终端报错
(4)第三方模块加载
-
如果传递给require()的模块标识符不是一个内置模块,也不是自定义模块,则Node.js会从当前模块的父母路开始,尝试从/node_modules文件夹中加载第三方模块
-
没有找到对应的第三方模块,则移动到再上一层父目录中进行加载,直到文件系统的根目录
(5)目录作为模块加载
-
在被加载的目录中查找package.json,寻找main属性作为加载的入口
-
如果没有package.json或main不存在无法解析,Node.js会试图加载index.js
-
没有package.son,没有main,没有index.js,则打印错误消息
网友评论