目录
发布包
实例:包功能
格式化时间,HTML特殊字符转义,转义的特殊字符还原
初始化包的基本结构
- 创建文件夹,作为包的根目录
- 创建三个文件
- package.json (包管理配置文件)
- index.js (包入口文件)
- README.md (包的说明文件)
初始化package.json
{
"name": "tools-demo-gyh",
"version": "1.0.0",
"main": "index.js",
"description": "提供了格式化时间功能",
"keywords": ["dateFormat"],
"license": "ISC"
}
name 包名
供别人下载使用
注意:在https://www.npmjs.com/检索是否重名
version 版本
一般新的包都是1.0.0开始
main 入口文件
使用时导入的文件入口
description 包简单介绍
搜索包时看到简介,知道基本功能
keywords 搜索的关键字
是个数组,每一项是一个字符串
license 开源许可协议
npm希望使用默认提供的 ISC 许可协议
index.js编写
在index.js定义方法
// 这是包的入口文件
// 时间格式化
function dateFormat(dateStr) {
// 实例化日期类
const time = new Date(dateStr);
// 获取完整的年份(4位)
const year = time.getFullYear();
// 获取月份(0-11,0代表1月)
const month = time.getMonth() + 1;
// 获取日期(1-31)
const date = time.getDate();
// 获取小时
let h = time.getHours();
h = h < 10 ? '0' + h : h;
// 获取分钟
let m = time.getMinutes();
m = m < 10 ? '0' + m : m;
// 获取秒钟
let s = time.getSeconds();
s = s < 10 ? '0' + s : s;
//测试打印
console.log(`${year} 年${month} 月${date} 日 ${h}:${m}:${s}`);
// 合并返回
return `${year}年${month}月${date}日 ${h}:${m}:${s}`;
}
// 向外暴露需要的成员
module.exports = {
dateFormat
}
外界导入,因为main指定了入口。所以导入只写文件夹也可以找到
const tools = require('./npm/tools-demo-gyh/index')
const tools = require('./npm/tools-demo-gyh')
模块化拆分
不同的方法放到不同的js中
index.js
导入模块,得到需要向外共享的方法
导出方法
编写包的说明文档 README
安装方法,导入方式,格式化时间,转义HTML特殊字符,使用方法。开源协议
发布包
注册npm账号
登录邮箱,点击验证链接,激活账号
终端登录
npm login
注意:在运行npm login命令之前,必须先把下包的服务器地址切换为npm的官方服务器,否则会导致发布包失败 (nrm ls检查一下)
把包发布到npm上
终端切换到包的根目录,运行
npm publish
包名要唯一,不可雷同
删除已发布的包
npm unpublish
只能删除72小时以内发布的包,
删除的包,在24小时内不允许重复发布
尽量不要往npm上发布没有意义的包
模块的加载机制
模块在第一次加载后会被缓存,这也意味着,多次调用require()不会导致模块的代码被执行多次
不论是内置模块,自定义模块,第三方模块,都优先从缓存中加载,从而提高模块的加载效率
内置模块的加载机制
内置模块的加载优先级最高。如果node_modules有重名的。优先加载内置模块
自定义模块的加载机制
必须指定以./或../开头的路径表示符,如果没有指定,则node会把它当成内置模块或第三方模块进行加载
导入时,如果省略了文件名,则Node.js会按顺序分别尝试加载一下文件
安装确切的文件名进行加载
补全.js拓展名进行加载
补全.json拓展名进行加载
补全.node拓展名进行加载
加载失败,终端报错
第三方模块的加载机制
从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块
如果没有找到对应的第三方模块,则移动到再上一次的父目录中,进行加载,知道文件系统的根目录
目录作为模块
当把目录当作模块标识,进行加载
- 在被加载的目录下找package.json,找到main属性,
- 如果目录中没有package.json,或main入口不存在或无法解析,则Node.js将会是土加载目录下的index.js文件
- 如果上面都失败,则终端打印错误信息