首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在模块外使用“import.meta”

无法在模块外使用“import.meta”
EN

Stack Overflow用户
提问于 2022-10-30 05:26:06
回答 1查看 397关注 0票数 2

我有带有以下文件的Node + Express + Babel + ES6项目:

/package.json

代码语言:javascript
运行
复制
{
  "name": "test-backend",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "babel-node src/index.mjs",
    "build": "babel src --out-dir build",
    "start": "node build/index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "@babel/cli": "^7.19.3",
    "@babel/core": "^7.19.6",
    "@babel/node": "^7.19.1",
    "@babel/plugin-transform-runtime": "^7.19.6",
    "@babel/preset-env": "^7.19.4",
    "babel-plugin-module-extension": "^0.1.3"
  }
}

/.babelrc.js

代码语言:javascript
运行
复制
module.exports = {
  presets: ['@babel/preset-env'],
  plugins: ['@babel/transform-runtime', ['module-extension', { mjs: 'js' }]],
  sourceMaps: false,
  retainLines: false,
  minified: true,
};

/src/index.mjs

代码语言:javascript
运行
复制
import express from 'express';
import path from 'path';
import { fileURLToPath } from 'url';
import { sum } from './utils.mjs';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();

app.get('/', (req, res) => {
  const result = sum(3, 2);
  res.send(`current dir: ${__dirname} | sum(3, 2) = ${result}`);
})

const port = 8080;

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

src/utils.mjs

代码语言:javascript
运行
复制
export const sum = (num1, num2) => num1 + num2;

我可以使用以下命令正确地测试该网站:

代码语言:javascript
运行
复制
$ npm run dev

然后转到:http://localhost:8080

我可以使用以下命令正确地构建网站:

代码语言:javascript
运行
复制
$ npm run build

它将生成一个新目录:/build

我的问题是:当我尝试用命令运行构建的网站时,

代码语言:javascript
运行
复制
$ npm start

我得到以下错误:SyntaxError: Cannot use 'import.meta' outside a module。下面是完整的错误:

代码语言:javascript
运行
复制
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

> test-backend@1.0.0 start
> node build/index.js

D:\myproject\build\index.js:1
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _express=_interopRequireDefault(require("express"));var _path=_interopRequireDefault(require("path"));var _url=require("url");var _utils=require("./utils.js");var _filename=(0,_url.fileURLToPath)(import.meta.url);var _dirname=_path["default"].dirname(_filename);var app=(0,_express["default"])();app.get("/",function(req,res){var result=(0,_utils.sum)(3,2);res.send("current dir: ".concat(_dirname," | sum(3, 2) = ").concat(result))});var port=8080;app.listen(port,function(){console.log("Example app listening on port ".concat(port))});
                                                                                                                                                                                                                                                                                                               ^^^^

SyntaxError: Cannot use 'import.meta' outside a module
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1033:15)
    at Module._compile (node:internal/modules/cjs/loader:1069:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47

此问题表明是由于/src/index.mjs上的下列行引起的。

代码语言:javascript
运行
复制
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

这是转移的/build/index.js

代码语言:javascript
运行
复制
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _express = _interopRequireDefault(require("express"));
var _path = _interopRequireDefault(require("path"));
var _url = require("url");
var _utils = require("./utils.js");
var _filename = (0, _url.fileURLToPath)(import.meta.url);
var _dirname = _path["default"].dirname(_filename);
var app = (0, _express["default"])();
app.get("/", function (req, res) {
  var result = (0, _utils.sum)(3, 2);
  res.send("current dir: ".concat(_dirname, " | sum(3, 2) = ").concat(result));
});
var port = 8080;
app.listen(port, function () {
  console.log("Example app listening on port ".concat(port));
});

在这里您可以看到代码使用:import.meta.url,这是冲突的行。

我的要求是:

  • 需要获得当前的工作方向玩具,因为我有资源在那里,我需要的应用程序运行。
  • 需要源代码为:ES6,这样我就可以使用类、导入、导出等。

知道该怎么做吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-11-01 01:28:36

您需要构建为CommonJS还是ESM?

对于支持的Node版本的ESM构建,您可以:

  • 更新package.json “类型”:“模块”
  • 更新./babelrc.js: 导出默认的{预设:[@babel/预设-env“,{模组: false }],//其余的是相同的.}

关于modules设置

将此设置为false将保留ES模块。

现在快跑

代码语言:javascript
运行
复制
npm run build
npm start

或者,您可以使用babel的--out-file-extension选项,并在构建脚本中使用.mjs。您仍然需要更新@babel/preset-env以保留ES模块系统。我认为,只要您想要使用ES模块,在package.json中使用package.json就更干净、更清晰。

对于CommonJS build,您需要:

  • 将您的文件从.mjs重命名为.js,这样确定模块系统的启发就不会在确定模块系统和CommonJS之间切换,用于开发/构建运行。
  • 删除import.meta的使用,并使用CommonJS模块可用的全局
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74250705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档