su37josephxia / frontend-interview

前端面试知识点
MIT License
159 stars 45 forks source link

是否可以利用swc或者esbuild提升webpack构建速度 #106

Open su37josephxia opened 2 years ago

QbjGKNick commented 2 years ago

什么是 swc 和 esbuild

swc(stands for Speedy Web Compiler)是一个基于 Rust 语言的可扩展平台,目前已经被 Next.js、Parcel、Deno 等使用。它支持编译和打包。 esbuild 是一个基于 Go 语言的构建工具。 各自特性 swc 的特性:

esbuild 的特性:

swc 和 esbuild 为什么快

swc 为什么快 Js 的执行流程: 未命名文件 将源码转变成 AST 树很耗时,而 swc 是基于 Rust 语音的,它直接将源码根据不同平台编译成对应的二进制文件,直接跳过了转AST 步骤,速度大大提升。

esbuild 为什么快

swc 和 esbuild 在 webpack 中使用

swc 在 webpack 中使用 在 webpack 中需要用 swc-loader 来使用

module: {
  rules: [
    {
      test: /\.m?js$/,
      exclude: /(node_modules)/,
      use: {
        // `.swcrc` can be used to configure swc
        loader: "swc-loader"
      }
    }
  ];
}

webpack 中需要用 esbuild-loader 来使用

module: {
      rules: [
          {
                test: /\.(js|jsx)$/,
                loader: 'esbuild-loader',
                options: {
                    loader: 'jsx',
                    target: 'es2015'
                },
          }
      ]
}
qytayh commented 2 years ago

结论

可以

为啥

esbuild是使用 go 编写的打包工具,多线程能力比node强,和Webpack、Rollup 等常用打包工具对比,在速度方面拥有绝对优势。esbuild-loader 可以用于在 Webpack 中使用 esbuild 去编译 JS、TS;压缩脚本、样式等。

SWC 是一个类似于 Babel 的代码转义器,它的主要功能就是把 ES2015 或更高版本的 JS 代码转换为老浏览器能够使用的 ES5 或更低版本的 JS 代码。SWC 是使用 Rust 语言编写的,相比 Babel 来说,速度要更快。按照官网的说法 SWC 的速度要比 Babel 快 20 倍

792472461 commented 2 years ago

可以

esbuild是使用 go 编写的打包工具,多线程能力比node强,和Webpack、Rollup 等常用打包工具对比,在速度方面拥有绝对优势。esbuild-loader 可以用于在 Webpack 中使用 esbuild 去编译 JS、TS;压缩脚本、样式等。

SWC 是一个类似于 Babel 的代码转义器,它的主要功能就是把 ES2015 或更高版本的 JS 代码转换为老浏览器能够使用的 ES5 或更低版本的 JS 代码。SWC 是使用 Rust 语言编写的,相比 Babel 来说,速度要更快。按照官网的说法 SWC 的速度要比 Babel 快 20 倍

zzzz-bang commented 2 years ago

可以

yanzefeng commented 2 years ago

可以

674252256 commented 2 years ago

swc是一个基于 Rust 语言的可扩展平台,目前已经被 Next.js、Parcel、Deno 等使用。它支持编译和打包。 esbuild 是一个基于 Go 语言的构建工具。 各自特性 swc 的特性: 可用于编译 可用于打包(swcpack) 支持 Minification 利用 WebAssembly 进行转换 可以用于 webpack 中(swc-loader) @swc/jest 提高 Jest 性能 支持自定义插件 esbuild 的特性:

极快的速度,无需缓存 支持 ES6 和 CommonJS 模块 支持对 ES6 模块进行 tree shaking swc : 将源码转变成 AST 树很耗时,而 swc 是基于 Rust 语音的,它直接将源码根据不同平台编译成对应的二进制文件,直接跳过了转AST 步骤,速度大大提升。

esbuild :

它是用 Go 语言编写的,并可以编译为本地代码; 大量使用并行操作; 未引用第三方依赖; 内存的高效利用,尽量复用 AST 数据。

chunhuigao commented 2 years ago

swc和Esbuild不行,Esbuild-loader和swc-loader可以

Esbuild

swc

wzl624 commented 2 years ago
alec1815 commented 2 years ago

swc与 esbuild都可以提升webpacke的构建速度。其中swc是由 rust 写的,而esbuild是由go实现的。

zcma11 commented 2 years ago

可以。文件内容的读写 rust 和 go 都能做到。

为什么用 swc 和 esbuild 更快,其实是因为 JavaScript 慢。因为 JavaScript 自身的原因,没有多线程,没有办法利用系统做更多优化。

webpack 构建中最花时间的是 babel。转换代码遍历 ast。还有很多 babel 的插件。所以可以使用 swc 和 esbuild 代替 babel 以及压缩代码,提升速度。(swc 直言目标是取代 babel。wwwww)

方法:

  1. 使用 swc-loader 代替 babel。
  2. 使用 esbuild-loader 中的 ESBuildMinifyPlugin 压缩代码。

毕竟是用其他语言接入 js 会有不够好的地方,但是也在飞快迭代,未来可期。

rachern commented 2 years ago

可以

用 js 写的 babel 无法使用多核 CPU 优化编译任务处理,相较 swc、esbuild 编译成二进制在 node 执行而言,具有一定的劣势。 这是语言方面的劣势

目前可以使用 swc-loader、esbuild-loader 在 webpack 中配置 swc 和 esbuild 链路

partiallove commented 2 years ago

可以 swc是一个类似babel的JavaScript/TypeScript编译器,但是由于swc使用Rust实现,所以具备比babel出色的性能。 esbuild 是使用 go 编写的打包工具,esbuild-loader 可以用于在 Webpack 中使用 esbuild 去编译 JS、TS ,能大大提升编译效率 用swc-loader代替 babel-loader 用esbuild-loader ESBuildMinifyPlugin 去压缩代码

guoshukun1994 commented 2 years ago

可以 swc也可以和babel实现同样的功能,将高版本代码转为为Es5代码,swc是基于rust语言的,在编译的时候直接省去了耗时较多的AST的转化过程,将源码转化为二进制文件,效率显著提升 esbuild是基于go语言实现的,并可以编译为本地代码,大量使用并行操作,未引用第三方依赖,内存的高效利用,尽量复用 AST 数据

jiafei-cat commented 2 years ago

可以, 在webpack配置中可以使用swc-loader/esbuild-loader加快构建速度,但是目前阶段swcesbuild还有许多坑未走完,生产环境慎用,除非有一定rust/go语言基础或大量时间。

jj56313751 commented 2 years ago

结论:可以

swc

crazyyoung1020 commented 2 years ago

可以

swc是一个用 Rust 写的高性能 TypeScript / JavaScript 转译器,类似于 babel。对比 babel,swc 有至少 10 倍以上的性能优势。 我们可以使用swc-loader来代替babel-loader来加快webpack的构建速度。

esbuild 是用go语言编写的新一代的 JavaScript 打包工具。以速度快而著称,耗时只有 webpack 的 2% ~3%,vite就内置了esbuild。那么想用esbuild来加快webpack构建速度的话,可以用esbuild-loader来替换babel-loader。

ruixue0702 commented 2 years ago

可以 swc 基于 Rust ,在单线程上比 Babel 快 20倍,在四核上快 70 倍

esbuild 基于 go,速度可以达到现有打包工具的10到100倍

zhenyuWang commented 2 years ago

可以。

swc

rust 编写,编译时可以直接将代码根据不同平台来编译成对应的二进制文件,省略了前面最耗时的步骤。词法解析,语法解析生成 ast 的过程。

esbuild

go 语言编写,可以充分利用多线程打包,并且线程之间共享内容,而 JS 如果使用多线程还需要有线程通信(postMessage)的开销;
而且可以直接编译成机器码,而不用像 Node 一样先将 JS 代码解析为字节码,然后转换为机器码,大大节省了程序运行时间。