node.js - Azure 应用服务 (Windows) - SvelteKit 应用的 Nodejs ES 模块问题
问题描述
真的希望有人能用这个为我指明正确的方向,因为我一点运气都没有。我正在尝试在基于 Windows 的 azure 应用服务上托管一个简单的 nodejs sveltekit 应用程序,但无法启动/运行该应用程序。
我正在使用 sveltekit 的适配器节点适配器将构建输出生成为自包含节点应用程序。在 sveltekit 生成构建输出后,我将一个简单的 package.json 文件注入到构建文件夹的根目录中,以指示节点使用 ESM 样式导入,该导入仅包含 type="module" 的单个属性。
包.json
{
"type": "module"
}
最后,我还将 web.config 注入构建文件夹的根目录以与 IISNode 一起使用。使用的 web.config 文件与 MS 提供的 nodejs 快速入门指南相同。web.config 可以在这里看到。
构建输出的最终文件夹结构很简单:
build
└───assets
│ └───_app
│ │ ...
└───prerendered
│ index.js
│ package.json
│ web.config
在本地,我可以使用这个构建文件夹,将它放在我机器上的任何位置,只需运行它即可完美运行:
node index.js
问题
即使它在本地完美运行,但当我将应用程序部署到 Azure 应用服务时,应用程序不会从浏览器启动,只是显示“此页面现在无法正常工作”。
当我检查日志时,我看到以下错误:
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: D:\home\site\wwwroot\index.js
require() of ES modules is not supported.
require() of D:\home\site\wwwroot\index.js from D:\Program Files (x86)\iisnode\interceptor.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from D:\home\site\wwwroot\package.json.
该错误告诉我,MS 的 iisnode\interceptor.js 使用的是 commonjs 样式的 require 语法,并且无法导入我的 index.js 的 ES 模块。
我在这里发现有人有类似的问题和建议的解决方案。建议的解决方案是在我的 index.js 文件旁边创建一个新文件,并将其配置为 web.config 中的应用程序服务(或更具体地说是 iisnode)的入口点。新文件将命名为 run.cjs,并且仅包含以下内容:
import("./index.js");
我尝试了这个选项,添加新的 run.cjs 文件并更新 web.config 以将其设置为 IISNodes 入口点:
<add name="iisnode" path="run.cjs" verb="*" modules="iisnode"/>
当我这样做后尝试该站点时,我遇到了一个新问题。该网站现在加载,但不是看到应用程序,来自 index.js 的 js 将作为原始文本呈现到浏览器中。
azure 应用服务 WEBSITE_NODE_DEFAULT_VERSION 设置为 ~14,我可以从 Kudu 看到运行的版本是 14.16.0 - 我的本地机器是 14.17.0,所以节点版本看起来没问题。
有人可以帮忙吗??
提前致谢
解决方案
推荐阅读
- python - 如何将 Django 的身份验证模型与自定义 REACT 前端注册集成
- android - android房间插入复杂对象自引用表
- airflow - 气流调度程序问题
- python - 如何保存列表的前三个元素而不将整个列表保存在内存中
- arangodb - 尽管最小深度设置为 1,但仍包含 Arangodb AQL 起始顶点
- angular - Angular Reactive 表单正在验证所有迭代
- json - 将 Spark 的数据框的 Json 列转换为对象数组
- flutter - 沿着一条线绘制文本颤振?
- node.js - 将 Angular/NodeJS HTTPS 客户端转换为 Spring Boot 应用程序
- sql - Postgres 函数存在于特定模式中