禁止从非系统模块导入系统模块

禁止对系统模块 (.sys.mjs) 进行静态导入声明,该操作应在非系统模块中执行。

在非系统模块中对系统模块进行静态导入会导致创建导入对象的单独实例,该实例与其他系统模块不共享,并且会破坏每个进程的单例预期。

原因是在系统模块内部,静态导入会将模块加载到共享全局中。在非系统模块内部,静态导入会加载到不同的全局(例如 window)。这会导致模块加载到不同的作用域中,从而创建单独的实例。解决方法是使用 ChromeUtils.importESModule,它将通过系统模块共享全局作用域导入对象。

此规则不正确的代码示例:

在非系统模块中

import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";

此规则正确的代码示例:

在非系统模块中

const { AppConstants } = ChromeUtils.importESModule(
  "resource://gre/modules/AppConstants.sys.mjs"
);

在系统模块中

import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";