Express+EJS项目中Moment.js CDN客户端引入失败求助
解决Uncaught ReferenceError: moment is not defined错误
你遇到的问题核心在于ES模块的作用域隔离机制:你给moment的CDN脚本标签加了type="module",这会让它以ES模块模式运行,模块内部的变量默认不会挂载到全局window对象上;而你的app.js是普通脚本,它试图访问全局作用域里的moment变量,自然就会抛出未定义的错误。
下面给你几个可行的解决方案:
方案一:移除moment脚本的type="module"属性(最简单直接)
修改calendar.ejs里的moment引入代码,去掉type="module",这样moment会自动把自身挂载到全局window对象,app.js就能正常访问到:
<body> <!-- ... 其他页面内容 ... --> <script src="https://momentjs.com/downloads/moment-with-locales.js"></script> <script src="js/app.js"></script> </body>
方案二:将app.js也改为ES模块(符合现代前端规范)
如果你想保留模块开发方式,需要把app.js也声明为模块,然后通过import引入moment:
- 修改
calendar.ejs的脚本引入:
<body> <!-- ... 其他页面内容 ... --> <script type="module" src="js/app.js"></script> </body>
- 在
app.js顶部添加导入语句(建议使用支持ES模块的moment CDN链接,比如cdnjs的稳定版本):
import moment from 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment-with-locales.min.js'; // 接下来即可正常使用moment console.log(moment().format('YYYY-MM-DD'));
方案三:本地引入moment.js(避免CDN依赖问题)
如果担心CDN访问不稳定,也可以直接下载moment文件到本地项目:
- 下载
moment-with-locales.js文件,放到public/js目录下; - 修改
calendar.ejs的引入路径:
<body> <!-- ... 其他页面内容 ... --> <script src="js/moment-with-locales.js"></script> <script src="js/app.js"></script> </body>
额外排查小技巧
如果按上述方法仍未解决,可以打开浏览器开发者工具(F12):
- 切换到Network标签,刷新页面,检查moment脚本是否成功加载(状态码应为200);
- 切换到Console标签,确认是否有其他加载错误提示,比如CDN链接失效、文件路径拼写错误等。
内容的提问来源于stack exchange,提问作者Major_Ash
相关产品推荐
相关产品推荐

