[英]use ES6 import modules with pkg
我正在尝试使用 pkg 将 package 节点应用程序作为 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 启动正常
$ 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 模块导入吗?
尝试将app.js
重命名为app.mjs
确保您运行的是最新版本的 Node.js。 Node.js 中 ESM 的实现在版本 12.0.0 中发生了更改。 “类型”:10.x 不支持“模块”。
您需要在pkg
配置中添加options
。 因此,在package.json
中:
"pkg": {
"options": ["experimental-modules"]
}
如果我找到解决方案,我会发布更新,但这似乎不再可能。
ESM 模块不再是实验性的,它们是 Node 的核心部分,也是推荐使用的约定。
给定一个简单的测试,当前的 pkg 会生成一个警告,导致 ESM 模块文件被跳过并出现此错误,因此在运行时无法加载模块。 我不确定这是什么时候发生的,但我在这里发布了问题的简单重现: https://github.com/appurist/pkgtest/
我还在此处添加了对(已关闭)GitHub 问题的评论:https://github.com/vercel/pkg/issues/641#issuecomment-870013906
似乎没有任何解决方法,因为问题似乎出在pkg
本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.