问题标签 [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.
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%
所以.....我的问题如下:
- 我的模块动态导入是否有效?
- 为什么静态或动态导入似乎没有区别?
- 如何有效减少输出代码的大小,减少主页上 JS 的未使用百分比?
这一切都开始了,因为我在我的网站上运行了谷歌的 Lighthouse 测试,它报告我的结构和可访问性几乎完美,但性能 < 40。我的目标是解决这个问题。
我期待收到您关于如何尝试解决此问题并提高我的 Lighthouse Performance 分数的想法。
node.js - cwd 不在当前工作目录上执行
根据我对如何使用 nodejs 运行 shell 脚本文件的理解?,这段代码应该给我 js 文件的当前目录:
但结果是另一个目录。如何解决这个问题?我在 Windows 11 Home 上,并使用esbuild将 ts 捆绑到 js。
next.js - 在 netlify 和 mdx-bundler 中使用 nextjs 和 esbuild 时找不到模块“node:assert”
尝试添加“断言”导入,尝试节点 16.14.0,没有运气。有谁知道任何 esbuild 加载程序选项或 nextjs 配置来解决此故障?
javascript - 如何在 esbuild 中使用 React Routes?
我正在使用 esbuild 创建 React 应用程序,它运行良好,但是,当我尝试在应用程序上启用 react-router 时,它可以是构建器并且可以工作,但我无法在路由之间移动,初始配置:
我的路线是声明的:
但服务器给了我:Cannot GET /register
typescript - TypeError: _vm(...).SyntheticModule 不是构造函数
我正在使用esbuild-jest包作为 jest 代码转换器。
jest.config.js
:
index.ts
:
index.test.ts
:
当我运行jest
命令时,出现错误:
包版本:
节点版本:v14.16.0
我该如何解决这个问题?
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
我是否遗漏了什么,或者这最终是我在项目中采用的这种方法的死胡同?
ruby-on-rails - Bootstrap 5.1 在 JSBundling Rails 7 中不起作用?
我开始使用默认的 Rails 模板,现在我想将 Bootstrap v5.1 与 Rails 一起使用。我删除了 Importmap-Rails 并继续添加 JSBundling-Rails 和 CSSBundling-Rails。样式工作正常,但 Bootstrap JavaScript 命令似乎都没有工作。我究竟做错了什么?
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
和它们都属于. 怎么可能没有函数?arguments
bind
call
Function.prototype
copy
javascript - 如何使用 esbuild 将全局变量导出为捆绑包?
我正在测试用 esbuild 替换 Webpack 5。你如何在包中导出全局变量?我有一个依赖项,jQuery,但将来我会拥有更多。我的 esbuild 脚本是:
并且libs.js
指示捆绑的依赖项是:
这是我的package.json
:
运行构建脚本将正确捆绑 jQuery,dist/libs.{hash}.js
但通过脚本标签将其包含在网页中既不暴露window.$
也不暴露window.jQuery
. 我如何让这些出口?
在 Webpack 5 中,我会用它expose-loader
来实现:
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
运行check
npm 脚本。通过手动运行它npx jest
也可以(它globalTeardown
作为测试项目运行)。开玩笑的运行完成并按您的预期返回。
但是,通过运行它npx jest --watch
会导致挂起,并且交互式运行器的控制台变得无响应,需要 CTRL+C 来杀死它。
是否有某种方法可以调用与线束和 ttypnpm run check
配合得更好的 shell 命令?jest --watch