如何在VS Code中运行使用ES6 import语法的JavaScript文件?
Node运行ES模块import语法报错解决方案
你不需要第一时间就把代码改成require写法,有两种成熟方案可以解决问题,优先选无代码改动的原生支持方案即可。
方案1:启用Node原生ES模块支持(最简便,推荐)
Node从14.0版本开始就稳定支持ES模块语法了,不需要改任何业务代码,只要加一行配置即可:
- 如果项目根目录还没有
package.json文件,先在终端进入项目目录执行npm init -y生成配置文件 - 打开
package.json,在顶层配置项中添加"type": "module"字段 - 保存配置后,重新执行
node 你的文件名.js运行代码,就能正常识别import/export语法了
注意:加了这个配置后,项目下所有.js后缀的文件都会被默认当作ES模块解析,如果个别文件需要用CommonJS语法,可以把后缀改成.cjs单独指定。
方案2:改写为CommonJS的require语法
如果你的项目因为旧依赖兼容等原因无法启用ES模块,再考虑修改代码:
- 替换导入语句:把文件顶部的
import axios from 'axios'修改为const axios = require('axios') - 替换导出语句:把文件底部的
export default scoreService修改为module.exports = scoreService
修改完成后的完整代码如下:
const axios = require('axios') const baseUrl = 'http://localhost:3001/api/scores' const getAll = () => { const request = axios.get(baseUrl) return request.then(response => response.data) } const create = (newObject) => { const request = axios.post(baseUrl, newObject) return request.then(response => response.data) } const update = (id, newObject) => { const request = axios.put(`${baseUrl}/${id}`, newObject) return request.then(response => response.data) } const scoreService = {getAll, create, update} module.exports = scoreService
其他文件中导入这个模块的时候,也要对应把import写法改成const scoreService = require('./你的scoreService文件路径')才能正常调用。
日常开发优先选择方案1,ES模块是TC39标准规范,和前端浏览器、现代前端框架的语法保持一致,不需要在两种模块语法之间来回切换,维护成本更低。
内容的提问来源于stack exchange,提问作者Roger Wang
相关产品推荐
相关产品推荐

