【问题标题】:use ES6 import modules with pkg将 ES6 导入模块与 pkg 一起使用
【发布时间】:2020-02-12 00:00:02
【问题描述】:

我正在尝试使用 pkg 将节点应用程序打包为 exe,并且我想使用 ES6 导入。

我的 src/app.js 中有这样的内容:

import express from 'express'
const app = express()

const eco = (req, res) => {
  const { method, url, headers, query } = req
  res.json({ method, url, headers, query })
}

app.all('/', eco)

app.listen(3000, () => console.log(`listening on http://localhost:3000`))

在我的 package.json 中有:

{
  "name": "pkg-test",
  "version": "1.0.0",
  "description": "",
  "main": "src/app.js",
  "type": "module",
  "type": "module",
  "scripts": {
"build": "pkg --targets=node12-win-x64 --output=iisnode-pkg.exe --options experimental-modules src/app.js",
    "start": "node --experimental-modules src/app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "pkg": "^4.4.0"
  }

}

npm start 工作正常

$ npm start

> iisnode-pkg@1.0.0 start C:\data\devel\apps\tmp\iisnode-pkg
> node --experimental-modules src/app.js

(node:10668) ExperimentalWarning: The ESM module loader is experimental.
welcome to iisnode-pkg
iisnode-pkg listening on http://localhost:3000

但是npm run build 会减弱,然后运行 ​​exe 会引发错误:

>npm run build

> iisnode-pkg@1.0.0 build C:\data\devel\apps\tmp\iisnode-pkg
> pkg --targets=node12-win-x64 --output=iisnode-pkg.exe src/app.js --config package.json

> pkg@4.4.0
> Warning Failed to make bytecode node12-x64 for file C:\snapshot\iisnode-pkg\src\app.js
>iisnode-pkg.exe
C:\snapshot\iisnode-pkg\src\app.js:2
import express from 'express'
       ^^^^^^^

SyntaxError: Unexpected identifier
    at Module._compile (internal/modules/cjs/loader.js:701:23)
    at Module._compile (pkg/prelude/bootstrap.js:1268:32)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:768:10)
    at Module.load (internal/modules/cjs/loader.js:626:32)
    at Function.Module._load (internal/modules/cjs/loader.js:553:12)
    at Function.Module.runMain (pkg/prelude/bootstrap.js:1316:12)
    at internal/main/run_main_module.js:17:11

似乎没有考虑到 package.json 中构建脚本中的 --options experimental-modules 参数。

知道如何从使用 pkg 打包的节点应用程序中使用 ES6 模块导入吗?

【问题讨论】:

标签: javascript node.js import es6-modules


【解决方案1】:

如果我找到解决方案,我会发布更新,但这似乎不再可行。

ESM 模块不再是实验性的,它们是 Node 的核心部分,也是推荐使用的约定。

给定一个简单的测试,当前的 pkg 会生成一个警告,导致 ESM 模块文件被跳过并出现此错误,因此在运行时无法加载该模块。我不确定这是什么时候发生的,但我在这里发布了一个简单的问题重现: https://github.com/appurist/pkgtest/

我还在此处添加了对(已关闭)GitHub 问题的评论: https://github.com/vercel/pkg/issues/641#issuecomment-870013906

似乎没有任何解决方法,因为问题似乎出在pkg 本身。

【解决方案2】:

确保您运行的是相当新的 Node.js 版本。 The implementation of ESM in Node.js changed in version 12.0.0. "type": "module" wasn't supported in 10.x.

您需要将options 添加到pkg 配置中。 所以,在package.json

"pkg": {
    "options": ["experimental-modules"]
}

节点文档:https://nodejs.org/api/esm.html

【讨论】:

  • 这仍然有效吗?我很想知道如何将 experimental-modules 需要放在 package.json 中,但您链接到的页面没有提及 pkgoptions(命令行选项除外)。
猜你喜欢
  • 1970-01-01
  • 2018-05-30
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多