GitLab构建失败:使用EJS的<%-标签时提示找不到underscore依赖
问题背景
把EJS模板里的<%=标签换成<%-后,本地执行cross-env NODE_ENV=production webpack构建正常,但GitLab CI环境下构建失败,报错信息如下:
ERROR in ./views/forms/survey.ejs
Module not found: Error: Can't resolve 'underscore' in '/builds/ve/vsplatform/vsmanager/views/forms'
@ ./views/forms/survey.ejs 1:0-21
@ ./controllers/forms/surveyForm_controller.js
@ ./initialization.js
@ ./vsmanager.js
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! VSHOW_HTML_PLATFORM@1.0.0 build:prod:cross-env NODE_ENV=production webpack
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the VSHOW_HTML_PLATFORM@1.0.0 build:prod script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2022-08-25T16_22_43_830Z-debug.log
原因分析
EJS的<%-标签用于输出未转义的HTML内容,你使用的webpack EJS loader(比如ejs-loader)在处理该标签时,会默认依赖underscore库提供模板渲染的辅助方法。本地环境可能因为缓存、间接依赖已经安装过underscore,所以没触发报错;但CI环境是全新安装依赖,缺失该库就导致构建失败。
解决方案
方案1:显式安装underscore依赖
直接把underscore添加到生产依赖,确保CI环境能安装到该库:
npm install underscore --save
方案2:修改webpack loader配置,禁用underscore依赖
如果不需要underscore的辅助功能,可以调整EJS loader的配置,关闭自动引入underscore的逻辑。以ejs-loader为例,修改webpack配置:
module.exports = { module: { rules: [ { test: /\.ejs$/, loader: 'ejs-loader', options: { noUnderscore: true // 禁用underscore依赖 } } ] } }
方案3:同步依赖锁定文件
确认本地的package-lock.json或yarn.lock已经提交到仓库,保证CI环境安装的依赖版本和本地完全一致,避免依赖树差异引发问题。
内容的提问来源于stack exchange,提问作者Gustavo Freitas

