如何强制 grunt-init 生成的文件名保持小写风格

解读

在国内前端团队面试中,这道题表面问“文件名大小写”,实则考察三点:

  1. 是否真正用过 grunt-init 的模板机制(而非只会 npm install);
  2. 是否理解 Gruntfile.js 与模板文件之间的变量替换流程;
  3. 能否在跨平台协作场景下(Windows 不区分大小写,Linux 区分)给出可落地的工程化方案。
    答“把电脑系统改成英文”或“手动改”都会直接扣分,必须给出模板层自动化方案。

知识点

  • grunt-init 的模板变量体系:<%= propname %> 语法与 rename.json 规则
  • rename.json 的 key→value 映射可二次改写目标文件名
  • init.process 钩子:在文件写出前统一 toLowerCase()
  • npm 包命名规范(强制小写)与 Git 跨平台大小写敏感冲突的关联
  • Yeoman/generator-grunt 与 grunt-init 的差异(面试官常追问“为什么不用 Yeoman”)

答案

分三步在自定义模板里固化小写规则,团队后续 grunt-init xxx 即可无感落地:

  1. 在模板根目录新增 rename.json(grunt-init 级联合并):
{
  "lib/{%=name%}.js": "lib/{%= name.toLowerCase() %}.js",
  "test/{%=name%}_test.js": "test/{%= name.toLowerCase() %}_test.js"
}
  1. 若文件较多,可在 template.js 里统一拦截:
exports.template = function(grunt, init, done) {
  init.process({}, [], function(err, props) {
    // 强制把 name 属性转成小写
    props.name = props.name.toLowerCase();
    // 继续标准流程
    init.filesToCopy(props).forEach(function(obj) {
      obj.dest = obj.dest.toLowerCase();   // 目标路径整体小写
    });
    init.copyAndProcess(files, props, done);
  });
};
  1. 把该模板发布到私有 npm 或公司 GitLab,并在 README 中写明:

本模板已内置“文件名小写”规则,切勿手动修改大小写,避免 Linux 构建机找不到文件。

如此即可强制 grunt-init 输出全小写,零手工干预,CI 与本地保持一致。

拓展思考

  • 如果团队后续迁移到 Vite/Rollup,仍可用同一思路在 create-vite 模板里维护“小写约束”,保证历史项目迁移时大小写统一。
  • Monorepo 场景,可结合 lerna/nx 的 generator,把“小写文件名”作为 ESLint 自定义规则固化,实现“生成+校验”双保险。
  • 面试官可能追问“为何不用 Git config core.ignorecase”,需明确:该配置只影响本地检出,无法约束远程仓库,真正的源头应在模板层解决,而非依赖开发者自觉。