执行npm run build构建EJS项目报错:缺失build脚本,求正确配置
解决EJS项目npm run build无有效脚本的问题
EJS本身没有像React那样自带的react-scripts build这类官方build命令,它只是模板引擎,需要借助工具把EJS模板编译成可部署的静态HTML文件,给你两个可行方案:
方案一:使用ejs-cli快速编译
- 先安装ejs-cli开发依赖:
npm install ejs-cli --save-dev
- 修改package.json里的scripts,根据你的项目结构调整路径:
比如你的EJS模板放在src/views目录下,想把编译后的HTML输出到dist目录,就这么写:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "ejs src/views/*.ejs -o dist" }
- 参数说明:
-o指定输出目录;如果你的模板需要传入数据,还可以加-d data.json(比如项目根目录有data.json数据文件)。
方案二:自定义Node脚本(更灵活)
如果需要更复杂的编译逻辑(比如遍历子目录、动态传参),可以自己写Node脚本:
- 先安装ejs依赖:
npm install ejs --save-dev
- 在项目根目录新建
build.js文件,写入以下示例代码(根据你的项目结构调整路径):
const ejs = require('ejs'); const fs = require('fs'); const path = require('path'); // 配置模板目录和输出目录 const templateDir = path.join(__dirname, 'src/views'); const outputDir = path.join(__dirname, 'dist'); // 确保输出目录存在 if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } // 遍历并编译所有EJS文件 function compileTemplates(dir) { fs.readdirSync(dir, { withFileTypes: true }).forEach(file => { const fullPath = path.join(dir, file.name); if (file.isDirectory()) { // 递归处理子目录 const subOutputDir = path.join(outputDir, file.name); if (!fs.existsSync(subOutputDir)) fs.mkdirSync(subOutputDir); compileTemplates(fullPath); } else if (path.extname(file.name) === '.ejs') { // 编译EJS模板为HTML ejs.renderFile(fullPath, { // 这里可以传入全局数据,比如网站标题 siteTitle: '我的EJS项目' }, (err, content) => { if (err) throw err; const outputPath = path.join(outputDir, path.basename(fullPath, '.ejs') + '.html'); fs.writeFileSync(outputPath, content); console.log(`已编译:${file.name} -> ${outputPath}`); }); } }); } compileTemplates(templateDir);
- 修改package.json的scripts:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "node build.js" }
完成以上配置后,执行npm run build就能把EJS模板编译成静态HTML文件,直接部署dist目录里的文件即可。
内容的提问来源于stack exchange,提问作者Perx
相关产品推荐
相关产品推荐

