如何确保JavaScript文件仅作为CLI使用,永不被作为模块导入?
禁止危险CLI文件被作为模块导入的几种方法
1. 运行时强制检查(最直接有效)
在危险操作文件开头添加判断逻辑,一旦检测到被作为模块导入,立刻抛出错误终止执行:
针对CommonJS模块
如果文件是CommonJS格式(后缀.js且项目package.json未设置"type": "module"),添加以下代码:
// 危险操作文件 dangerous-cli.js if (require.main !== module) { throw new Error('该文件仅允许通过node命令直接执行,禁止作为模块导入!'); } // 后续的危险操作代码...
require.main指向直接被Node执行的模块,当文件被import/require导入时,当前模块module不等于require.main,触发错误终止运行。
针对ES模块
如果是ES模块格式(后缀.mjs或package.json设置"type": "module"),用以下判断:
// 危险操作文件 dangerous-cli.mjs import { fileURLToPath } from 'url'; import path from 'path'; const __filename = fileURLToPath(import.meta.url); if (__filename !== process.argv[1]) { throw new Error('该文件仅允许通过node命令直接执行,禁止作为模块导入!'); } // 后续的危险操作代码...
import.meta.url是当前模块的URL,转成文件路径后和process.argv[1](Node命令执行的目标文件路径)对比,不一致说明文件被导入而非直接执行。
2. 静态代码检查(提前拦截)
配置ESLint规则,禁止项目中导入该危险文件:
在项目ESLint配置文件(如.eslintrc.js)中添加自定义规则:
module.exports = { rules: { 'no-import-dangerous-file': { create: function(context) { return { ImportDeclaration(node) { if (node.source.value.includes('dangerous-cli.js')) { // 替换为你的目标文件名 context.report({ node: node, message: '禁止导入危险CLI文件,仅允许通过node命令直接执行' }); } }, CallExpression(node) { // 同时拦截CommonJS的require导入 if (node.callee.name === 'require' && node.arguments[0]?.value.includes('dangerous-cli.js')) { context.report({ node: node, message: '禁止导入危险CLI文件,仅允许通过node命令直接执行' }); } } }; } } } };
开发者编写代码时,ESLint会实时提示错误,阻止违规代码提交。
3. 流程与文档约束
- 将该文件放在项目独立目录下,通过
package.json的scripts配置固定执行命令:
{ "scripts": { "run-dangerous": "node ./scripts/dangerous-cli.js" } }
- 在项目README或内部文档中明确说明,仅允许通过
npm run run-dangerous执行该文件,禁止任何形式的导入引用。
内容的提问来源于stack exchange,提问作者hloth
相关产品推荐
相关产品推荐

