Skip to content

Comments

feat: support emit prebuilt chunk#7277

Merged
shulaoda merged 1 commit intomainfrom
copilot/support-emit-prebuilt-chunk
Dec 4, 2025
Merged

feat: support emit prebuilt chunk#7277
shulaoda merged 1 commit intomainfrom
copilot/support-emit-prebuilt-chunk

Conversation

Copy link
Contributor

Copilot AI commented Dec 1, 2025

Implements emitFile({ type: 'prebuilt-chunk', ... }) for Rollup API compatibility, allowing plugins to emit pre-built chunks directly to the bundle output. See https://rollupjs.org/plugin-development/#this-emitfile and rollup/rollup#4990

Changes

TypeScript

  • Added EmittedPrebuiltChunk interface with fileName, code, exports?, map?, sourcemapFileName?
  • Updated emitFile in plugin context to handle prebuilt-chunk type
  • Exported EmittedPrebuiltChunk from package index

Rust

  • Added EmittedPrebuiltChunk struct and prebuilt_chunks storage in FileEmitter
  • Implemented emit_prebuilt_chunk method
  • Updated get_file_name and add_additional_files to support prebuilt chunks

Bindings

  • Added BindingEmittedPrebuiltChunk NAPI struct
  • Added emit_prebuilt_chunk to BindingPluginContext

Usage

const plugin = {
  name: 'emit-prebuilt',
  buildStart() {
    const refId = this.emitFile({
      type: 'prebuilt-chunk',
      fileName: 'vendor.js',
      code: 'console.log("prebuilt");',
      exports: ['default'],
    });
    // this.getFileName(refId) => 'vendor.js'
  },
};
Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request]: Support emit prebuilt chunk</issue_title>
<issue_description>
[Feature Request]: Support emit prebuilt chunk · Issue rolldown/rolldown#4034 · rolldown/rolldown</issue_description>

Comments on the Issue (you are @copilot in this section)

@Boshen Plugin-legacy does not strictly require this, we have a draft PR https://github.com/vitejs/rolldown-vite/pull/80

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@graphite-app
Copy link
Contributor

graphite-app bot commented Dec 1, 2025

How to use the Graphite Merge Queue

Add the label graphite: merge to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

@netlify
Copy link

netlify bot commented Dec 1, 2025

Deploy Preview for rolldown-rs ready!

Name Link
🔨 Latest commit a701c3a
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/69312a86e7517d000805e147
😎 Deploy Preview https://deploy-preview-7277--rolldown-rs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copilot AI changed the title [WIP] Add support for emitting prebuilt chunk feat: support emit prebuilt chunk Dec 1, 2025
Copilot AI requested a review from shulaoda December 1, 2025 03:16
@shulaoda shulaoda force-pushed the copilot/support-emit-prebuilt-chunk branch from d20b9bc to 7bf9533 Compare December 4, 2025 05:59
@github-actions
Copy link
Contributor

github-actions bot commented Dec 4, 2025

Benchmarks Rust

  • target: main(af3fa42)
  • pr: copilot/support-emit-prebuilt-chunk(a701c3a)
group                                                        pr                                     target
-----                                                        --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol              1.00     62.3±2.28ms        ? ?/sec    1.04     64.9±1.47ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap    1.00     68.9±2.68ms        ? ?/sec    1.09     75.3±1.36ms        ? ?/sec
bundle/bundle@rome_ts                                        1.00    102.5±2.99ms        ? ?/sec    1.03    105.6±1.59ms        ? ?/sec
bundle/bundle@rome_ts-sourcemap                              1.00    117.2±1.96ms        ? ?/sec    1.02    119.2±1.66ms        ? ?/sec
bundle/bundle@threejs                                        1.00     39.0±2.21ms        ? ?/sec    1.02     39.8±0.72ms        ? ?/sec
bundle/bundle@threejs-sourcemap                              1.00     42.7±0.66ms        ? ?/sec    1.03     44.1±0.60ms        ? ?/sec
bundle/bundle@threejs10x                                     1.00    382.6±4.71ms        ? ?/sec    1.05    403.4±6.55ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                           1.00    449.9±6.05ms        ? ?/sec    1.04    468.9±5.08ms        ? ?/sec
scan/scan@rome_ts                                            1.00     79.5±1.18ms        ? ?/sec    1.01     79.9±2.30ms        ? ?/sec
scan/scan@threejs                                            1.00     27.8±1.91ms        ? ?/sec    1.02     28.3±1.89ms        ? ?/sec
scan/scan@threejs10x                                         1.00    283.6±6.53ms        ? ?/sec    1.00    282.5±3.32ms        ? ?/sec

@shulaoda shulaoda force-pushed the copilot/support-emit-prebuilt-chunk branch from 7bf9533 to a701c3a Compare December 4, 2025 06:30
@shulaoda shulaoda marked this pull request as ready for review December 4, 2025 06:30
Copilot AI review requested due to automatic review settings December 4, 2025 06:30
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR implements support for emitting prebuilt chunks via the emitFile({ type: 'prebuilt-chunk', ... }) API, bringing Rolldown closer to full Rollup API compatibility. This feature allows plugins to emit pre-compiled chunks directly to the bundle output without going through the normal bundling process, which is useful for cases like pre-minified vendor bundles or legacy polyfills.

Key Changes

  • Added EmittedPrebuiltChunk type and implementation across TypeScript, Rust, and NAPI bindings
  • Integrated prebuilt chunks into the file emitter system with proper reference ID tracking and filename conflict detection
  • Added test coverage for basic prebuilt chunk emission functionality

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
packages/rolldown/src/plugin/plugin-context.ts Added EmittedPrebuiltChunk interface and updated emitFile to handle prebuilt-chunk type by calling the new binding method
packages/rolldown/src/index.ts Exported EmittedPrebuiltChunk type for public API
packages/rolldown/src/binding.d.cts Added TypeScript binding definitions for BindingEmittedPrebuiltChunk and emitPrebuiltChunk method
crates/rolldown_common/src/file_emitter.rs Added EmittedPrebuiltChunk struct, storage in FileEmitter, and logic to add prebuilt chunks to bundle with conflict detection
crates/rolldown_common/src/lib.rs Exported EmittedPrebuiltChunk from the common crate
crates/rolldown_plugin/src/plugin_context/native_plugin_context.rs Added emit_prebuilt_chunk method to native plugin context
crates/rolldown_binding/src/options/plugin/types/binding_emitted_prebuilt_chunk.rs Created NAPI struct for BindingEmittedPrebuiltChunk with conversion to EmittedPrebuiltChunk
crates/rolldown_binding/src/options/plugin/types/mod.rs Declared the new binding module
crates/rolldown_binding/src/options/plugin/binding_plugin_context.rs Added emit_prebuilt_chunk method to binding plugin context
packages/rolldown/tests/fixtures/plugin/context/emit-prebuilt-chunk/_config.ts Added test verifying basic prebuilt chunk emission with code and exports
packages/rolldown/tests/fixtures/plugin/context/emit-prebuilt-chunk/main.js Added minimal test fixture input file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

self.file_emitter.emit_chunk(Arc::new(chunk)).await
}

pub fn emit_prebuilt_chunk(&self, chunk: rolldown_common::EmittedPrebuiltChunk) -> ArcStr {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shulaoda Could you add some explanation about the use cases of emit_prebuilt_chunk?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be honest, I'm not entirely sure about the specific use cases either. See https://rollupjs.org/plugin-development/#this-emitfile and rollup/rollup#4990

What's about below?

/// Emits a prebuilt chunk to the bundle output.
///
/// Unlike `emit_chunk` which creates a new entry point that goes through the full bundling
/// pipeline (resolving, loading, transforming, tree-shaking), `emit_prebuilt_chunk` allows
/// plugins to inject already-bundled JavaScript code directly into the output.
///
/// ## Use Cases
///
/// 1. **Worker scripts**: Inject pre-bundled web worker or service worker code that was
///    compiled separately.
///
/// 2. **Vendor chunks**: Add pre-built vendor libraries that don't need processing.
///
/// 3. **Code splitting with external tools**: Integrate chunks generated by other bundlers
///    or build tools into the rolldown output.
///
/// 4. **Dynamic code generation**: Emit runtime-generated JavaScript code as a chunk.
///
/// ## Difference from `emit_chunk`
///
/// - `emit_chunk`: Creates a new entry module that will be resolved, loaded, transformed,
///   and bundled. The final output depends on the bundling process.
///
/// - `emit_prebuilt_chunk`: Directly emits the provided code as-is to the output directory.
///   No further processing is applied - the code, exports, and sourcemap are used verbatim.

@shulaoda shulaoda merged commit c451836 into main Dec 4, 2025
35 checks passed
@shulaoda shulaoda deleted the copilot/support-emit-prebuilt-chunk branch December 4, 2025 11:41
shulaoda added a commit that referenced this pull request Dec 11, 2025
## [1.0.0-beta.54] - 2025-12-11

⏱️ Plugin Timing Analysis
- Added `checks.pluginTimings` option to emit warnings when plugins significantly impact build performance
- More details: https://rolldown.rs/options/checks#plugintimings
<img width="834" height="119" alt="image" src="https://github.com/user-attachments/assets/e819f906-6192-4503-8d5c-854fa92ecb45" />

> [!WARNING]
> For hooks using `ctx.resolve()` or `ctx.load()`, the reported time includes waiting for other plugins, which may overestimate that plugin's actual cost.
>
> Additionally, since plugin hooks execute concurrently, the statistics represent accumulated time rather than wall-clock time. The measured duration also includes Rust-side processing overhead, Tokio async scheduling overhead, NAPI data conversion overhead, and JavaScript event loop overhead.

### 🚀 Features

- rolldown_plugin_vite_reporter: add newline after build summary for better log separation (#7458) by @shulaoda
- plugin: collect plugin hook execution timings (#7364) by @shulaoda
- test-dev-server: reload page when detecting hmr reload message (#7422) by @hyf0
- rolldown_plugin_vite_dynamic_import_vars: add transform-based v2 implementation (#7400) by @shulaoda
- rolldown_plugin_vite_import_glob: add transform-based v2 implementation (#7394) by @shulaoda
- rolldown_plugin_vite_wasm_helper: add v2 implementation (#7402) by @shulaoda
- expose error location and context fields on JS API error objects (#7341) by @Copilot
- add `CIRCULAR_REEXPORT` error (#7337) by @Copilot
- support emit prebuilt chunk (#7277) by @Copilot

### 🐛 Bug Fixes

- preserve object key order when parse json with serde_json (#7443) by @IWANABETHATGUY
- improve JSON parsing with serde_json to emit proper diagnostic (#7442) by @IWANABETHATGUY
- deconflict external symbols in CJS modules (#7447) by @IWANABETHATGUY
- rolldown_plugin_vite_transform,rolldown_plugin_vite_resolve: enable `yarnPnp` option when pnp is detected (#5791) by @sapphi-red
- skip deconflicting top-level symbols for CJS modules (#7425) by @IWANABETHATGUY
- rolldown_plugin_esm_external_require: run resolveId hook before other plugins (#7426) by @shulaoda
- avoid duplicate underscores in legitimized identifiers (#7418) by @IWANABETHATGUY
- use `process.on('exit')` instead of `signal-exit` on webcontainers (#7421) by @sapphi-red
- dev: remove `imports` when an import is removed (#7348) by @sapphi-red
- bench: access latency.mean instead of mean in tinybench result (#7417) by @shulaoda
- path compression in symbol linking (#7392) by @IWANABETHATGUY
- rolldown_plugin_vite_resolve: add RwLock to avoid clearing cache while resolving (#7386) by @sapphi-red
- handle JSON prototype properties correctly (#7383) by @IWANABETHATGUY
- preserve entry signature strict chunk merging (#7343) by @IWANABETHATGUY
- support eliminating multiple unused dynamic imports in a single statement (#7361) by @IWANABETHATGUY
- eliminate unreachable dynamic entry (#7356) by @IWANABETHATGUY
- `NormalizedInputOptions#cwd` should always exists (#7360) by @hyf0
- cli: support multiple comma-separated define arguments (#7340) by @Copilot
- remove redundant symbol param in __reExport runtime helper (#7346) by @IWANABETHATGUY
- always use __export for empty namespace objects when symbols enabled (#7345) by @IWANABETHATGUY
- relax the restriction of preserveEntrySignatures when merging chunks (#7339) by @IWANABETHATGUY

### 🚜 Refactor

- builtin-plugin: make config parameter required for vite plugins (#7451) by @shulaoda
- move esbuild test related scripts to `scripts/src/esbuild-tests` (#7377) by @sapphi-red
- rewrite gen-esbuild-test in TypeScript (#7376) by @sapphi-red
- remove unnecessary Option in current_stmt_idx (#7359) by @IWANABETHATGUY
- move more code into chunk optimizer (#7335) by @IWANABETHATGUY

### 📚 Documentation

- checks: clarify pluginTimings measures CPU time due to concurrent execution (#7448) by @shulaoda
- checks: add accuracy note to pluginTimings documentation (#7441) by @shulaoda
- development-guide: add esbuild test description (#7439) by @sapphi-red
- checks: expand `pluginTimings` documentation with detection mechanism (#7428) by @shulaoda
- add checks options documentation (#7427) by @shulaoda
- development-guide: add test262 integration test description (#7430) by @sapphi-red
- guide: fix grammer in getting-started (#7331) by @jakeparis

### 🧪 Testing

- rollup-tests: make `--grep` work and document it (#7431) by @sapphi-red
- add a way to run some test262 test cases by name (#7429) by @sapphi-red
- rolldown_plugin_vite_dynamic_import_vars: add test cases for v2 implementation (#7401) by @shulaoda
- rolldown_plugin_vite_import_glob: add test cases for v2 implementation (#7395) by @shulaoda
- triage new esbuild tests (#7405) by @sapphi-red
- hmr: delete file used (#5933) by @sapphi-red
- watch: add `watchChange` hook `create` / `delete` tests (#7349) by @sapphi-red
- hmr: delete file not used anymore (#5932) by @sapphi-red
- triage esbuild failed reasons (#7391) by @sapphi-red
- change esbuild tests stats and diff generation (#7379) by @sapphi-red
- dev: add `continuous generate hmr patch` and `debounce bundle` tests (#7368) by @hyf0
- add new esbuild tests (#7353) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- setup Node before updating snapshots for test262 update (#7435) by @sapphi-red
- run tests when submodules are updated (#7455) by @sapphi-red
- exclude NUL path pattern to prevent crash on Windows (#7450) by @IWANABETHATGUY
- run cargo-test for esbuild script changes and update esbuild snapshot (#7440) by @sapphi-red
- jsx_import_meta tests to `ignoreReasons` due to architectural limitation (#7434) by @Copilot
- deps: update dependency oxlint-tsgolint to v0.8.5 (#7433) by @renovate[bot]
- update test dependencies automatically (#7432) by @sapphi-red
- remove unused code (#7420) by @IWANABETHATGUY
- add back `just update-esbuild-diff` and add it to CI (#7404) by @sapphi-red
- deps: update oxc-resolver to 11.15.0 (#7415) by @shulaoda
- deps: update rust crate napi to v3.7.0 (#7393) by @renovate[bot]
- fix esbuild compatibility metrics calculation (#7390) by @sapphi-red
- support `tsconfig: true` in rust tests (#7389) by @sapphi-red
- hide oxc runtime in snapshots (#7388) by @sapphi-red
- deps: update oxc to v0.102.0 (#7385) by @camc314
- improve esbuild tests to download snapshots automatically (#7378) by @sapphi-red
- deps: update dependency tinybench to v6 (#7371) by @renovate[bot]
- deps: update actions/checkout action to v6 (#7370) by @renovate[bot]
- deps: update rust crates (#7367) by @renovate[bot]
- deps: update dependency oxlint to v1.32.0 (#7374) by @renovate[bot]
- deps: update dependency oxlint-tsgolint to v0.8.4 (#7373) by @renovate[bot]
- node/test-dev-server: support using custom html file (#7357) by @hyf0
- test: setup browser-based e2e test for `test-dev-server` (#7351) by @hyf0
- pin pnpm to version 10.23.0 (#7369) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.18.3 (#7372) by @renovate[bot]
- deps: update github-actions (#7365) by @renovate[bot]
- deps: update npm packages (#7366) by @renovate[bot]
- polish the comments about `SymbolRefFlags` (#7358) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.18.2 (#7355) by @renovate[bot]
- fix esbuild test generation script (#7352) by @sapphi-red
- apply cargo shear suggestion (#7347) by @IWANABETHATGUY
- deps: update oxc to v11.15.0 (#7344) by @renovate[bot]
- deps: update dependency @napi-rs/cli to v3.5.0 (#7338) by @renovate[bot]
- deps: update dependency oxlint to v1.31.0 (#7305) by @renovate[bot]
- update rollup-tests results (#7333) by @sapphi-red
- update rollup-tests Rollup version (#7332) by @sapphi-red
- add ignore config for test262 submodule (#7326) by @Copilot

### ❤️ New Contributors

* @jakeparis made their first contribution in [#7331](#7331)

Co-authored-by: shulaoda <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature Request]: Support emit prebuilt chunk

3 participants