不能在模块外使用'import.meta'

编程入门 行业动态 更新时间:2024-10-05 21:15:36

不<a href=https://www.elefans.com/category/jswz/34/1771313.html style=能在模块外使用'import.meta'"/>

不能在模块外使用'import.meta'

我有

Node + Express + Babel + ES6
项目包含以下文件:

/package.json

{
  "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

module.exports = {
  presets: ['@babel/preset-env'],
  plugins: ['@babel/transform-runtime', ['module-extension', { mjs: 'js' }]],
  sourceMaps: false,
  retainLines: false,
  minified: true,
};

/src/index.mjs

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

export const sum = (num1, num2) => num1 + num2;

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

$ npm run dev

然后去:http://localhost:8080

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

$ npm run build

这将生成一个新目录:

/build
.

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

$ npm start

我收到以下错误:

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

npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

> [email protected] 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 ObjectpileFunction (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
:

import { fileURLToPath } from 'url';

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

这是转译的

/build/index.js

"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
    这样我就可以使用类、导入、导出等

关于如何使这项工作有任何想法吗?

谢谢!

回答如下:

你需要构建是 CommonJS 还是 ESM?

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

  • 更新

    package.json

    "type": "module"
    
  • 更新

    ./babelrc.js

      export default {
         presets: [['@babel/preset-env', { modules: false }]],
         // The rest is the same ...
      }
    

关于

modules
设置

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

现在运行

npm run build
npm start

或者,您可以使用 babel 的

--out-file-extension
选项并在构建脚本中使用
.mjs
。您仍然需要更新
@babel/preset-env
以保留 ES 模块系统。我认为每当您想使用 ES 模块时,在
"type": "module"
中使用
package.json
会更清晰。

对于 CommonJS 构建 你需要:

  • 将您的文件从
    .mjs
    重命名为
    .js
    因此用于 determining 模块系统 的启发式不会在 ESM 和 CommonJS 之间切换以进行开发/构建运行。
  • 删除
    import.meta
    的使用并使用CommonJS模块可用的
    __dirname
    全局。

更多推荐

不能在模块外使用'import.meta'

本文发布于:2024-05-30 06:09:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1770193.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:能在   模块   import   meta

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!