index.js无法识别导入的moment模块,Node模块引入报错求助
问题
项目一开始没package.json,跑了npm init后装了moment包,但前端的index.js死活认不出它:
- 用
import moment from 'moment';报错:
dex.html:1 Uncaught TypeError: Failed to resolve module specifier "moment". Relative references must start with either "/", "./", or "../".
- 手动写相对路径
../../node_modules/moment/moment.js引入,结果发现这个文件根本没导出内容 - 试了
const moment = require('moment');,又报:
dex.js:11 Uncaught ReferenceError: require is not defined
另外打算用Express搭网站,需要把Node.js配置弄对。
解决办法(按需选择)
1. 纯前端场景:适配ES模块
浏览器原生ES模块不识别moment这类裸模块名,且旧版moment未做ES模块适配,可按以下方式处理:
- 换用支持ES模块的
moment-es6分支:
先安装包:
然后在npm install moment-es6index.js中用相对路径引入:import moment from './node_modules/moment-es6/moment.js'; - 或使用导入映射(需Chrome 89+等现代浏览器支持):
在index.html中添加配置,给script标签加上type="module":
之后<script type="importmap"> { "imports": { "moment": "./node_modules/moment-es6/moment.js" } } </script> <script type="module" src="index.js"></script>index.js里就能直接写import moment from 'moment';了
2. 搭Express后端:托管静态资源
既然要做Express服务,直接通过后端托管静态资源,用moment的全局UMD版本最省事:
- 先安装Express:
npm install express - 新建
server.js作为服务入口:const express = require('express'); const path = require('path'); const app = express(); // 让浏览器能访问node_modules中的资源 app.use(express.static(path.join(__dirname, 'node_modules'))); // 托管项目根目录的静态文件(如index.html、index.js) app.use(express.static(__dirname)); app.listen(3000, () => { console.log('服务已启动:http://localhost:3000'); }); - 修改
index.html,直接通过script标签引入moment:
此时<script src="/moment/moment.js"></script> <script src="index.js"></script>index.js里直接用全局的moment变量即可,无需import/require:console.log(moment().format('YYYY-MM-DD')); - 启动服务:
访问node server.jshttp://localhost:3000即可正常使用moment
3. 复杂项目:用构建工具(推荐)
如果后续项目功能复杂,用Vite/Webpack等构建工具自动处理模块解析:
- 安装Vite:
npm install vite --save-dev - 在
package.json中添加脚本:{ "scripts": { "dev": "vite", "build": "vite build" } } index.js里直接写import moment from 'moment';即可- 启动开发服务:
构建工具会自动处理模块路径,无需手动配置npm run dev
内容的提问来源于stack exchange,提问作者Lvasche
相关产品推荐
相关产品推荐

