首页 > 解决方案 > 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,所以节点版本看起来没问题。

有人可以帮忙吗??

提前致谢

标签: node.jsazureazure-web-app-serviceiisnodesveltekit

解决方案


请在您的项目中重新安装/更新 npm 模块。确保所有这些文件都存在于您的项目中。在本地构建应用程序并将其发布到 Azure 应用服务后,请勿将 index.js 文件导入其他文件(如 run.cjs 或 run.mjs)中。

{ 
    "type": "module" 
}

package.json 文件中需要上述代码。

在此处输入图像描述

检查您的 npm 参考文件,如果其中任何一个未正确安装,那么您将获得 app,js 文件中存在的原始数据作为输出


推荐阅读