
userscript的元数据块(metadata block)中,大多数注释指令(如 @name、@author、@description 等)的书写顺序不影响解析结果,仅 `@require` 指令需严格按依赖顺序排列,以确保脚本正确加载外部资源。
在编写 Userscript 时,元数据块是以 // @key value 格式书写的特殊注释,位于脚本顶部,用于向用户脚本管理器(如 Tampermonkey、Violentmonkey、Greasemonkey 或 FireMonkey)声明脚本信息与运行要求。虽然这些行在 JavaScript 层面只是普通单行注释(即对浏览器引擎无实际执行意义),但用户脚本管理器会专门解析它们,并据此配置运行环境。
绝大多数元数据字段的顺序无关紧要:
例如以下两种写法功能完全等价:
// ==UserScript== // @name Example Script // @namespace example.com // @version 1.0 // @description A demo userscript // @author Alice // @match https://example.com/* // ==/UserScript==
等同于:
// ==UserScript== // @namespace example.com // @author Alice // @name Example Script // @match https://example.com/* // @version 1.0 // @description A demo userscript // ==/UserScript==
所有主流管理器(Tampermonkey、Violentmonkey、Greasemonkey、FireMonkey)均按字段语义而非位置进行解析,因此 @name 放在最前或最后,对脚本安装、显示名称、匹配逻辑均无影响。
⚠️ 唯一关键例外:@require
@require 指令用于引入外部 JS 库(如 jQuery、Lodash),其加载顺序直接影响执行依赖关系。若脚本 A 依赖库 B,而库 B 又依赖库 C,则必须按 C → B → A 的顺序书写 @require:
// @require https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js // @require https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js // @require https://example.com/my-utils.js
FireMonkey 明确要求 @require 严格顺序执行;Tampermonkey 和 Violentmonkey 同样遵循此约定——后声明的脚本可安全使用前声明库中的变量和函数。若顺序颠倒(如先引入 my-utils.js 再引入 lodash),可能导致 ReferenceError: _ is not defined 等运行时错误。
✅ 最佳实践建议:
- 元数据字段按逻辑分组书写(如标识类 @name/@namespace/@version → 描述类 @description/@author → 匹配类 @match/@include/@exclude → 资源类 @require/@resource),提升可读性与协作效率;
- 始终将 @require 置于元数据块靠后位置,并严格按依赖拓扑排序;
- 使用 // ==UserScript== / // ==/UserScript== 封装元数据块(推荐格式),增强兼容性与工具识别率。
总之,顺序不是语法强制要求,而是工程规范与可靠性的体现——合理组织元数据,既保障脚本稳健运行,也便于团队维护与长期演进。










