NODE_MODULES包如何读取项目根目录中的配置文件?

2022-08-08 00:00:00 node.js javascript npm node-modules

我正在创建一个NPM包,它需要能够从项目根目录读取配置文件。我不确定该怎么做。

例如

  • Next.js可以从项目根目录读取./pages/./next.config.js
  • Jest能够从项目根目录读取./jest.config.js
  • ESLint能够从项目根目录读取./.eslintrc.json
  • SPARTER能够从项目根目录读取./.prettierrc.js
  • 类型脚本能够从项目根目录读取./tsconfig.json
  • Babel能够从项目根目录读取./.babelrc

我试着查看他们的源代码,看看他们是如何做到这一点的,但项目太大了,我找不到相关的部分。

他们如何实现这一点?


解决方案

首先在path.dirname(process.mainModule.filename)中搜索,然后在目录树../ ../../中向上搜索,依此类推,直到找到该文件。

以下是我从rc(https://github.com/dominictarr/rc)包中窃取的代码:

const fs = require('fs');
const path = require('path');

// Utils shamefully stolen from
// https://github.com/dominictarr/rc/blob/master/lib/utils.js

find(...args) {
  const rel = path.join.apply(null, [].slice.call(args));
  return findStartingWith(path.dirname(process.mainModule.filename), rel);
}

findStartingWith(start, rel) {
  const file = path.join(start, rel);
  try {
    fs.statSync(file);
    return file;
  } catch (err) {
    // They are equal for root dir
    if (path.dirname(start) !== start) {
      return findStartingWith(path.dirname(start), rel);
    }
  }
}

parse(content) {
  if (/^s*{/.test(content)) {
    return JSON.parse(content);
  }
  return undefined;
}

file(...args) {
  const nonNullArgs = [].slice.call(args).filter(arg => arg != null);

  // path.join breaks if it's a not a string, so just skip this.
  for (let i = 0; i < nonNullArgs.length; i++) {
    if (typeof nonNullArgs[i] !== 'string') {
      return;
    }
  }

  const file = path.join.apply(null, nonNullArgs);
  try {
    return fs.readFileSync(file, 'utf-8');
  } catch (err) {
    return undefined;
  }
}

json(...args) {
  const content = file.apply(null, args);
  return content ? parse(content) : null;
}

// Find the rc file path
const rcPath = find('.projectrc');
// Or
// const rcPath = find('/.config', '.projectrc');

// Read the contents as json
const rcObject = json(rcPath);
console.log(rcObject);

您还可以将RC包用作依赖项npm i rc

请注意,这是同步,因此它将阻止代码执行,直到它完成。

相关文章