问题标签 [esbuild]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
33 浏览

javascript - 减少 Rails 应用程序中的 Javascript 大小并提高性能分数。也许ESBuild有问题?

不是特定的 Rails 问题,而是 Rails 应用程序中的问题。

在我的应用程序中,我使用jsbundling-rails配置了esbuild.

这个 gem在我的文件中添加了build一行。package.json它可以工作并编译我所有的 JS 并且运行良好。但是,我发现生成的文件相当大,所以我开始寻找优化它的方法。

此时我的 esbuild 语句如下所示:

首先,我认为我可以尝试使我的进口有条件。例如,仅在实际需要时才导入它们。我在这里问了另一个关于如何做到这一点的问题。

我在这方面学到了很多东西,但归根结底,奇怪的是,这对我的 JS 的输出没有任何影响。

Chrome 目前说我的主 JS 文件有 91% 的代码未使用。看起来所有导入仍在一起编译,无论它们是静态导入还是动态导入。为什么会这样?

然后我进一步观察esbuild,我发现了--splitting旗帜。这听起来相当正确,所以我将我的build脚本更新为:

这导致大量输出 JS 文件(我认为它们被称为“块”。

我运行了我的应用程序,但 JS 无法加载。控制台说

未捕获的语法错误:无法在模块外使用 import 语句

我不是 100% 确定为什么会这样,但我只是猜测我需要添加type: "module"到我javascript_include_tag的 Rails 应用程序布局视图中。

这使得 JS 加载(这很好:-))

但是...未使用的 JS 代码的百分比仍然是我的 application.js 的 84%

所以.....我的问题如下:

  1. 我的模块动态导入是否有效?
  2. 为什么静态或动态导入似乎没有区别?
  3. 如何有效减少输出代码的大小,减少主页上 JS 的未使用百分比?

这一切都开始了,因为我在我的网站上运行了谷歌的 Lighthouse 测试,它报告我的结构和可访问性几乎完美,但性能 < 40。我的目标是解决这个问题。

我期待收到您关于如何尝试解决此问题并提高我的 Lighthouse Performance 分数的想法。

0 投票
0 回答
21 浏览

node.js - cwd 不在当前工作目录上执行

根据我对如何使用 nodejs 运行 shell 脚本文件的理解?,这段代码应该给我 js 文件的当前目录:

但结果是另一个目录。如何解决这个问题?我在 Windows 11 Home 上,并使用esbuild将 ts 捆绑到 js。

0 投票
0 回答
17 浏览

next.js - 在 netlify 和 mdx-bundler 中使用 nextjs 和 esbuild 时找不到模块“node:assert”

尝试添加“断言”导入,尝试节点 16.14.0,没有运气。有谁知道任何 esbuild 加载程序选项或 nextjs 配置来解决此故障?

0 投票
0 回答
26 浏览

javascript - 如何在 esbuild 中使用 React Routes?

我正在使用 esbuild 创建 React 应用程序,它运行良好,但是,当我尝试在应用程序上启用 react-router 时,它可以是构建器并且可以工作,但我无法在路由之间移动,初始配置:

我的路线是声明的:

但服务器给了我:Cannot GET /register

0 投票
0 回答
31 浏览

typescript - TypeError: _vm(...).SyntheticModule 不是构造函数

我正在使用esbuild-jest包作为 jest 代码转换器。

jest.config.js

index.ts

index.test.ts

当我运行jest命令时,出现错误:

包版本:

节点版本:v14.16.0

我该如何解决这个问题?

0 投票
0 回答
39 浏览

typescript - IntersectionType 不适用于通过 esbuild 捆绑的类转换器装饰器_when_,即使使用 esbuild 插件也是如此

所以这个问题与IntersectionType doesn't work with class-transformer有关。在那里,解决方案是从 nestjs 7 升级到 8(有效地将 @nestjs/swagger 从 4.5.12-next.1 升级到 5.1.2)。唉,这不是故事的结局。我所看到的是,当与 esbuild 捆绑时(即使使用推荐的插件),来自 class-transformer 的装饰器不会被 IntersectionType 继承。但是 class-validate 装饰器是按预期继承的。

要重现,请克隆https://github.com/adrian-grajdeanu/nestjs-issue0 接下来我将包含并讨论来自上述 repo 的代码。

这是一个演示代码:

通过 ts-node 运行上述程序时,一切正常:

请注意,@Type 和 @Transform 内的代码已运行并且验证/转换成功。

但是将此 cc.ts 与 esbuild 捆绑在一起。这是捆绑脚本:

运行这个

它会生成 c.js 捆绑文件。如果我运行这个

请注意,@Type 和 @Transform 装饰器中的代码未运行并且验证失败。该类根本没有转换(我在类转换中的 plainToClass 函数前面放置了一个垫片,并检查了之前和之后)。但是验证失败,因为类验证装饰器是由 IntersectionType 继承的。

这是 IntersectionType 的问题!我试过没有它,一切都按预期工作。我知道 esbuild 和装饰器存在问题,我专门使用了来自 @anatine/esbuild-decorators 的 esbuildDecorators 插件。

这是我的 tsconfig.json

和 package.json

我是否遗漏了什么,或者这最终是我在项目中采用的这种方法的死胡同?

0 投票
1 回答
38 浏览

ruby-on-rails - Bootstrap 5.1 在 JSBundling Rails 7 中不起作用?

我开始使用默认的 Rails 模板,现在我想将 Bootstrap v5.1 与 Rails 一起使用。我删除了 Importmap-Rails 并继续添加 JSBundling-Rails 和 CSSBundling-Rails。样式工作正常,但 Bootstrap JavaScript 命令似乎都没有工作。我究竟做错了什么?

0 投票
0 回答
33 浏览

typescript - esbuild 的复制插件“不是函数”

我正在处理 esbuild 配置,并希望manifest.json在构建项目以进行测试时将文件 ( ) 复制到特定文件夹。我将复制插件包含在我的esbuild-config.mjs

我什至可以Ctrl + Click进入 VS Code 中的复制功能。

然后当我运行它时,它告诉我 copy 不是一个函数:

编辑:进一步研究

我发现了这个问题,其中复制(到剪贴板)功能产生了相同的错误:devtools console: copy is not a function while on youtube

问题是,DOM 包含另一个名为 copy 的元素,它不是函数。即使我不在浏览器中,我也尝试重命名导入。

结果相同:

当我删除导入时,我得到

所以进口进口了一些东西。VS Code 告诉我鼠标悬停在该副本上的是一个函数,其中一个可选参数返回 a esbuild.Plugin

如果我编写copy.VS Code 甚至可以为我提供代码完成,例如,apply和它们都属于. 怎么可能没有函数?argumentsbindcallFunction.prototypecopy

0 投票
1 回答
33 浏览

javascript - 如何使用 esbuild 将全局变量导出为捆绑包?

我正在测试用 esbuild 替换 Webpack 5。你如何在包中导出全局变量?我有一个依赖项,jQuery,但将来我会拥有更多。我的 esbuild 脚本是:

并且libs.js指示捆绑的依赖项是:

这是我的package.json

运行构建脚本将正确捆绑 jQuery,dist/libs.{hash}.js但通过脚本标签将其包含在网页中既不暴露window.$也不暴露window.jQuery. 我如何让这些出口?


在 Webpack 5 中,我会用它expose-loader来实现:

0 投票
0 回答
20 浏览

typescript - 从 `jest --watch` 执行 tsc

在我的 monorepo 中,我使用 esbuild 快速运行测试,npx jest --watch但是当我将tsc命令添加到运行的测试集中时,手表控制台挂起并变得无响应。

我想tsc并行运行,以便最终在测试结果迅速报告几秒钟后收到编译器错误通知(esbuild 跳过打字稿类型并仅运行 javascript)。

我在没有手表的情况下并行生成tsc的方法,但我无法让它与--watch. 它会导致与 关联的交互式终端挂起jest --watch,可能与stdio:"inherit". 但是,如果没有 stdio 选项,我看不到输出。

我错过了什么?

我的顶层jest.config.js目前看起来像这样,它针对 monorepo 中的三个不同的测试套件。它适用于--watch. 我可以使用交互式控制台以这种方式运行和重新运行测试......

一个check脚本在 package.json 中声明为简单的"check": "tsc". I can uncomment the code above to run the globalTeardown` 任务,它会导致为测试套件的每次运行运行检查。

拆解任务的来源如下。如果代码编译成功,则正确成功,否则失败。

手动运行它从控制台成功node check.js运行checknpm 脚本。通过手动运行它npx jest也可以(它globalTeardown作为测试项目运行)。开玩笑的运行完成并按您的预期返回。

但是,通过运行它npx jest --watch会导致挂起,并且交互式运行器的控制台变得无响应,需要 CTRL+C 来杀死它。

是否有某种方法可以调用与线束和 ttypnpm run check配合得更好的 shell 命令?jest --watch