新插件不能直接写 index.js 是因为 atom 插件加载器默认只识别 index.coffee 为入口,若用 javascript 必须在 package.json 中显式声明 "main"、"activationhooks" 和 "engines" 字段,否则命令注册、生命周期钩子均失效。

直接用 apm init 创建项目,但默认生成的 index.coffee 是历史包袱;现在写插件,优先选 JavaScript + 显式声明 "main",否则命令注册、生命周期钩子全失效。
为什么新插件不能直接写 index.js?
Atom 插件加载器默认只识别 index.coffee 为入口,且自动绑定 activationHooks 和 require 路径。若新建 lib/index.js 却不改 package.json,会出现:
-
Uncaught Error: Cannot find module 'my-plugin'(模块找不到) - 按
Cmd+Shift+P搜不到命令(activationHooks未触发) -
atom.commands.add执行时报atom is not defined(activate()在 Atom 初始化前就被调了)
根本原因:Atom 不会主动扫描 lib/ 下的 JS 文件,除非你在 package.json 中明确写:
"main": "./lib/index.js"
且必须手动创建 lib/ 目录——apm init -p my-plugin --syntax javascript 不会帮你建它。
package.json 里哪些字段不能省?
除了常规的 name、version、description,这三个是硬性要求:
-
"main":必须指向实际入口文件,如"./lib/main.js";留空或写错路径 → 插件不加载 -
"activationHooks":必须是非空数组,如["atom-workspace:pane-active"];空数组或缺失 → 命令永不注册 -
"engines":至少声明"atom": ">=1.7.0 ;版本不匹配 → apm 安装时静默失败
注意:"commands" 字段只是菜单快捷方式映射,不影响命令本身是否可用;真正决定命令能否出现的是 activationHooks + atom.commands.add 的位置。
命令注册后为什么还是 “command not found”?
常见错误不是代码写错了,而是注册时机和作用域不匹配:
- 命令名必须是
namespace:action格式,例如"my-plugin:toggle";写成"toggle"或"myPlugin.toggle"都不会进命令面板 -
atom.commands.add必须在activate()函数体内调用,不能放在模块顶层(Node 模块加载时 Atom 尚未 ready) - 作用域选择要精准:
'atom-text-editor'表示只在编辑器焦点时生效;若想全局可用,得用'atom-workspace',但要注意权限和性能影响 - 如果用了自定义 selector(比如
'my-custom-element'),必须确保该元素已挂载,否则监听无效
一个最小可运行示例(lib/main.js):
export function activate() {
atom.commands.add('atom-text-editor', 'my-plugin:insert-timestamp', () => {
const editor = atom.workspace.getActiveTextEditor()
if (editor) editor.insertText(new Date().toISOString())
})
}
本地调试时为什么改了代码没反应?
Atom 不会热重载插件 JS 代码,每次修改后必须手动重载:
- 快捷键
Ctrl+Alt+Cmd+L(macOS)或Ctrl+Alt+R(Windows/Linux)强制重载窗口 - 或者在 DevTools Console 里执行
atom.packages.reloadPackage('my-plugin') - 更稳妥的方式是开两个 Atom 窗口:一个用于开发(
atom --dev启动),一个用于测试;--dev模式下修改lib/文件后保存,再按重载快捷键,效果立见
容易被忽略的一点:如果你在 activate() 里用了 atom.workspace.onDidAddTextEditor 这类异步监听,而插件刚激活时编辑器还没创建,那回调可能永远不触发——得配合 atom.workspace.getTextEditors() 做一次初始化补漏。











