[学习笔记]抽离 elpis npm 包

46 阅读1分钟

本文基于抖音“哲玄前端”, 《全栈实践课》,引擎内核实现章节所写。

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没问题的包发生以下报错 3e809d02140e9003817d936a496c369.jpg 猜测package.json配置出现问题,将原先依赖删除重新下载后发现@babel/runtime不存在,从而知道第三方库升级导致原先存在的依赖包不存在需要独自下载 npm install @babel/runtime -D 后重新发布 npm ,使其 npm 完成。