# JavaScript > 本文件是 `dev-expert` 的 JS/Node.js 框架专项补充参考,不作为独立子技能计数,也不提供 `@` 显式调用入口。命中 JavaScript、Node.js、ES6+、代码风格、代码检查、PHP 内联 JS 等信号时,按需与 `code-generation`、`api-design`、`bug-diagnosis`、`code-review`、`software-project` 协同加载。 ## 适用边界 - 适用:浏览器端现代 JS(ES2017+)、Node.js 服务端开发、JS 代码风格规范、Node.js 代码语法检查与修复、PHP 文件内联 JS 强制校验。 - 不适用:TypeScript 项目(类型系统由 TS 编译器处理,JSDoc 仅作补充)、非 JS 运行时的前端框架(Flutter/React Native 原生部分)、浏览器 API 兼容性 polyfill 选型、GoF 设计模式教学、JSDoc 文档生成。 - 运行环境:Node.js >= 15.0.0(推荐 18+),ES 模块优先于 CommonJS。 ## 架构规则 1. **const 优先**:默认使用 `const`,仅当变量确实需要重新赋值时才用 `let`,禁止使用 `var`。 2. **ES 模块优先**:使用 `import`/`export` 代替 `require`/`module.exports`,享受静态分析和 tree-shaking 优势。 3. **类语法优先**:使用 ES6 `class` 语法代替原型链直接操作,保持代码可读性。 4. **严格相等**:使用 `===` 和 `!==`,仅在检查 `null`(同时覆盖 `undefined`)时允许 `== null`。 5. **禁止修改内置原型**:绝不修改 `Array.prototype`、`Object.prototype` 等内置对象的原型。 6. **显式分号**:所有语句末尾使用显式分号,不依赖自动分号插入(ASI)。 7. **禁止 `eval` 和 `with`**:永远不使用 `eval()`、`Function` 构造函数和 `with` 语句。 8. **throw Error 对象**:抛出错误时始终使用 `throw new Error(...)`,不使用 `throw "string"`。 9. **for-of 优于 for-in**:遍历数组使用 `for-of` 或数组方法(`map`/`filter`/`reduce`),遍历对象键用 `Object.keys()`。 10. **新抽象必须有真实复用点**:少于 3 个调用点时优先内联,避免过度设计。 --- ## 代码质量检查流程 > 确保 JS 代码在本地 Node.js 环境中可成功执行的 4 步标准化工作流:Node.js 版本检查 → 语法检查 → 代码修复 → 可执行性验证。 ### 工作流概览 | 步骤 | 检查项 | 执行方式 | 要点 | | - | - | - | - | | 1 | Node.js 版本 | `node --version` | >= 15.0.0(推荐 18+),低于 15 须升级或在 README 中标注兼容范围 | | 2 | 语法正确性 | `node --check ` | 静态分析,检测不兼容的 ES6+ 特性、语法错误 | | 3 | 代码规范修复 | 人工 / linter 自动修复 | 全角符号转半角、统一引号、补全分号、移除 `var` | | 4 | 可执行性验证 | `node -e ""` 或直接运行 | 试运行验证无运行时错误,检查依赖项是否可用 | ### 步骤 1:Node.js 版本检查 执行 `node --version`,确认已安装且版本 >= 15.0.0。若低于 15,需升级 Node.js 或在项目 README 中明确标注兼容范围。推荐使用 18+ LTS 以享受最新语言特性。 ### 步骤 2:语法检查 使用 `node --check` 对文件做静态语法分析,无需实际执行代码即可捕获: - 语法错误(括号不匹配、非法 token 等) - 不兼容的 ES6+ 特性(当 Node 版本过低时) - 严格模式违规 示例:`node --check app.js`,退出码 0 表示语法正确。 ### 步骤 3:代码规范修复 检查并修复常见编码问题: - 全角标点符号(中文逗号、引号)误入代码 - 文件编码异常(非 UTF-8) - 常见语法陷阱(`var` 声明、缺少分号、`==` 应改为 `===`) 可借助 ESLint 的 `--fix` 自动修复大部分问题。全角符号修复需特别注意字符串字面量中的中文内容不被误改。 ### 步骤 4:可执行性验证 使用 `node -e` 在隔离环境试运行代码片段,或直接 `node ` 执行完整文件,验证: - 无运行时错误(`ReferenceError`、`TypeError` 等) - 所有 `import` / `require` 的依赖项可正常解析 - 输出符合预期 若代码依赖 npm 包,需先执行 `npm install` 安装依赖。 ### 检查清单 - [ ] Node.js >= 15.0.0(`node --version`) - [ ] 语法检查通过(`node --check`) - [ ] 无全角符号混入、编码正常 - [ ] `var` 已替换为 `const`/`let` - [ ] 分号完整、`===` 替代 `==` - [ ] 可执行,无运行时错误 - [ ] 外部依赖已安装 - [ ] **PHP 内联 JS 已按「CMS / PHP 内联 JS」逐条校验**(见下节) --- ## CMS / PHP 内联 JS > 当 JavaScript 写在 **PHP 文件内**(混编 `` 与 HTML、或 `onclick="..."` 事件属性里的内联脚本)时,通用「代码质量检查流程」**不足以**防住一类特有的坑:`php -l` 只校验 PHP 语法,**对混在字符串 / HTML 属性里的 JS 完全无感**,未闭合的引号、括号、空串结尾都会被漏检,最终在浏览器报 `Uncaught SyntaxError`。本节固化此类场景的强制校验项。 ### 强制校验 1:HTML 事件属性的引号配对 `onclick="..."` / `onxxx="..."` 这类**双引号 HTML 属性内部,禁止出现裸双引号**——否则属性会提前闭合,后面的 JS 变成裸文本,轻则逻辑失效、重则 XSS。 - ❌ 错误:`onclick="forms["addplfaceform"].submit()"`(`["..."]` 里的 `"` 把属性截断) - ✅ 正确(三选一): - 改用方括号 + 单引号:`onclick="forms['addplfaceform'].submit()"` - 或点号访问:`onclick="document.addplfaceform.submit()"` - 或整体抽成函数:`onclick="submitForm('addplfaceform')"`(函数体写在 `