nodeJs中开发CLI如何允许用户自定义配置文件?例如wepack-cli如何加载用户webpack.config.js的?

luckybo
  • 166

问题描述:
       目前在使用nodeJs开发一个CLI工具,程序发布到npm(私服)上后,需要允许读取用户自定义配置js文件。此时如何在程序中加载这个.js文件呢?


例如wepack-cli如何加载用户webpack.config.js的?
看了看webpack-cli的源码

const requireConfig = function requireConfig(configPath) {
    let options = (function WEBPACK_OPTIONS() {
        if (argv.configRegister && argv.configRegister.length) {
            module.paths.unshift(path.resolve(process.cwd(), "node_modules"), process.cwd());
                argv.configRegister.forEach(dep => {
                    require(dep);
            });
            return require(path.resolve(process.cwd(), configPath));
        } else {
            return require(path.resolve(process.cwd(), configPath));
        }
    })();
    options = prepareOptions(options, argv);
    return options;
};

尝试过类似的的方法:

require(path.resolve(process.cwd() ,  'some.config.js'));
// Cannot find module 'E:codeFolder\some.config.js'

貌似nodeJsrequireJs不能使用这种超出当前根目录(codeFolder)的绝对路径去加载.

回复
阅读 1.2k
2 个回答
✓ 已被采纳

下半年沉迷造命令行轮子,还是亲自来回答这个吧~

方法1: path.resovle()

熟悉node.js的同学应该知道path路径模块。该模块有个方法path.resolve(pathName)

该方法,官方文档解释:该方法将路径或路径片段的序列解析为绝对路径。给定的路径序列从右到左进行处理,每个后续的path前置,直到构造出一个绝对路径。如果在处理完所有给定的path片段之后还未生成绝对路径,则再加上当前工作目录。

换句话说,如果调用path.resolve('webpack.config.js'),它会自动添加当前工作目录,返回一个完整的路径,如:E:\code\my-pr.config.js。此webpack-cli都能拿到webpack.config.js的完整路径。

方法2: path.cwd()

与方法一的思路类型,path.cwd()会返回当前js进程的工作目录,同样可以拿到用户项目根文件夹的完整绝对路径。调用如下:path.join(path.cwd(), 'webpack.config.js')

requireJS 可以通过绝对路径传的呀
作为bash参数传入呢?

// bash
node index.js ./file.js
// index.js
const path = process.argv[3]
你知道吗?

宣传栏