You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:46:17