本文基于抖音“哲玄前端”, 《全栈实践课》,引擎内核实现章节所写。
npm 包调试
在包的根目录下创建链接
# npm link
在另一个项目中,使用该链接。效果相当于你安装了这个包
# npm link {{名称}}
package.json扩展
{
"name": "xxxx", // 名称
"version": "1.0.2", // 版本号
"description": "", // 描述
"main": "index.js", // 包的入口文件
}
抽离elpis-core
以下为实例
module.exports = (app) => {
const middlewares = {};
// 读取 /elpis/app/middleware/**/**.js 下所有的文件
const elpisMiddlewarePath = path.resolve(
__dirname,
`..${sep}..${sep}app${sep}middleware`
);
const elpisFileList = glob.sync(
path.resolve(elpisMiddlewarePath, `.${sep}**${sep}**.js`)
);
elpisFileList.forEach((file) => {
handleFile(file);
});
// 读取 业务根目录/app/middleware/**/**.js 下所有的文件
const businessMiddlewarePath = path.resolve(
app.businessPath,
`.${sep}middleware`
);
const businessFileList = glob.sync(
path.resolve(businessMiddlewarePath, `.${sep}**${sep}**.js`)
);
businessFileList.forEach((file) => {
handleFile(file);
});
// 把内容加载到 app.middlewares 下
function handleFile(file) {
// 提取文件名称
let name = path.resolve(file);
// 截取路径 app/middleware/custom-module/custom-middleware.js => custom-module/custom-middleware
name = name.substring(
name.lastIndexOf(`middleware${sep}`) + `middleware${sep}`.length,
name.lastIndexOf(".")
);
// 把 '-' 统一改成驼峰式,custom-module/custom-middleware => customModule.customMiddleware
name = name.replace(/[_-][a-z]/gi, (s) => s.substring(1).toUpperCase());
// 挂载 middleware 到内存 app 对象中
let tempMiddleware = middlewares;
const names = name.split(sep);
for (let i = 0, len = names.length; i < len; ++i) {
if (i === len - 1) {
tempMiddleware[names[i]] = require(path.resolve(file))(app);
} else {
if (!tempMiddleware[names[i]]) {
tempMiddleware[names[i]] = {};
}
tempMiddleware = tempMiddleware[names[i]];
}
}
}
app.middlewares = middlewares;
};
发布npm
查看当前镜像源
# npm config get
清空存在镜像
# npm config set registry
重复确认
# npm config get
登录npm
# npm login
查看 npm 账号
# npm whoami
发布
# npm publish (首次会报错)
# npm publish --access public
碰到的问题
在完成以上全部步骤后,将npm包下载发现本地link没问题的包发生以下报错
猜测package.json配置出现问题,将原先依赖删除重新下载后发现@babel/runtime不存在,从而知道第三方库升级导致原先存在的依赖包不存在需要独自下载 npm install @babel/runtime -D 后重新发布 npm ,使其 npm 完成。