Skip to content

Add support for with type text under a new experimental flag, following what webpack did#89560

Open
lukesandberg wants to merge 9 commits intocanaryfrom
import_with_type_text_turbopack
Open

Add support for with type text under a new experimental flag, following what webpack did#89560
lukesandberg wants to merge 9 commits intocanaryfrom
import_with_type_text_turbopack

Conversation

@lukesandberg
Copy link
Contributor

@lukesandberg lukesandberg commented Feb 5, 2026

Summary

Adds support for the TC39 import ... with { type: "text" } proposal to Turbopack, allowing files to be imported as strings.

This is gated behind a new experimental flag turbopackImportTypeText.

// next.config.js
export default {
  experimental: {
    turbopackImportTypeText: true,
  },
}
import text from './file.txt' with { type: 'text' }
// text is a string containing the file contents

Related TC39 Proposals

  • type: "text" - Stage 2 - Import file contents as a string
  • type: "bytes" - Stage 2.7 - Import file contents as a Uint8Array (already supported via turbopackImportTypeBytes)

Implementation Details

  • Created TextSourceTransform which transforms any file into an ES module exporting the file contents as a string
  • Added ResourceHasModifier rule condition to match on ident modifiers, enabling proper module type resolution after source transforms
  • Refactored BytesSourceTransform to use the same pattern for consistency
  • Both transforms add a modifier to the ident (text_module / bytes_module) for uniqueness, allowing the same file to be imported both normally and with a type attribute

Using a source transform is simpler and allows the modules to participate in other bundler optimizations more easily (scope hoisting in particular)

This also fixes a few bugs where with imports would conflict with other module type rules:

  • if you attempted to import a .js file with type:'bytes' didn't work since the file extension matching would trigger first.
  • if you set a module type rule in your next config it would override the with attribute

Test Plan

  • Expanded e2e tests at test/e2e/turbopack-import-with-type/

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. tests Turbopack Related to Turbopack with Next.js. type: next labels Feb 5, 2026
Copy link
Contributor Author

lukesandberg commented Feb 5, 2026

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 5, 2026

Tests Passed

@codspeed-hq
Copy link

codspeed-hq bot commented Feb 5, 2026

CodSpeed Performance Report

Merging this PR will not alter performance

Comparing import_with_type_text_turbopack (6194f5d) with canary (09851e2)

Summary

✅ 17 untouched benchmarks
⏩ 3 skipped benchmarks1

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 6, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▁█▁▁▁
Cold (Ready in log) 439ms 439ms ▂█▁▁▂
Cold (First Request) 1.187s 1.141s ▃█▄▁▃
Warm (Listen) 457ms 456ms ▁█▁▁▁
Warm (Ready in log) 444ms 443ms ▁█▁▁▁
Warm (First Request) 340ms 343ms ▂█▂▁▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 455ms 456ms ▁▅▁▁▁
Cold (Ready in log) 438ms 439ms ▅▅▄▁▁
Cold (First Request) 1.830s 1.848s ▃▄▃▁▁
Warm (Listen) 457ms 456ms ▁▄▁▁▁
Warm (Ready in log) 439ms 437ms ▃▄▅▁▁
Warm (First Request) 1.841s 1.850s ▂▄▃▁▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.875s 3.900s ▁█▁▁▁
Cached Build 3.878s 3.908s ▁█▁▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 13.862s 13.882s ▁▄▂▁▁
Cached Build 13.905s 13.939s ▁▃▂▁▁
node_modules Size 467 MB 467 MB █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles: **437 kB** → **437 kB** ⚠️ +13 B

81 files with content-based hashes (individual files not comparable between builds)

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 766 B 762 B
Total 766 B 762 B ✅ -4 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 451 B 450 B
Total 451 B 450 B ✅ -1 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.47 kB N/A -
6280-HASH.js gzip 56.9 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.53 kB N/A -
e8aec2e4-HASH.js gzip 62.5 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 256 B 254 B
main-HASH.js gzip 39.1 kB 39.1 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.52 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.48 kB -
6948ada0-HASH.js gzip N/A 62.5 kB -
9544-HASH.js gzip N/A 57.5 kB -
Total 230 kB 231 kB ⚠️ +613 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.49 kB 2.49 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.97 kB ✅ -1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 249 kB 249 kB
Total 375 kB 375 kB ⚠️ +474 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 617 B 615 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 33 kB 33.2 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 34.6 kB 34.8 kB ⚠️ +253 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 732 B 736 B
Total 732 B 736 B ⚠️ +4 B
Build Cache
Canary PR Change
0.pack gzip 3.85 MB 3.85 MB 🔴 +5.58 kB (+0%)
index.pack gzip 102 kB 102 kB
index.pack.old gzip 103 kB 102 kB
Total 4.05 MB 4.06 MB ⚠️ +4.82 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 315 kB 315 kB
app-page-exp..prod.js gzip 167 kB 167 kB
app-page-tur...dev.js gzip 315 kB 315 kB
app-page-tur..prod.js gzip 167 kB 167 kB
app-page-tur...dev.js gzip 312 kB 312 kB
app-page-tur..prod.js gzip 165 kB 165 kB
app-page.run...dev.js gzip 312 kB 312 kB
app-page.run..prod.js gzip 165 kB 165 kB
app-route-ex...dev.js gzip 70.5 kB 70.5 kB
app-route-ex..prod.js gzip 49 kB 49 kB
app-route-tu...dev.js gzip 70.5 kB 70.5 kB
app-route-tu..prod.js gzip 49 kB 49 kB
app-route-tu...dev.js gzip 70.1 kB 70.1 kB
app-route-tu..prod.js gzip 48.8 kB 48.8 kB
app-route.ru...dev.js gzip 70.1 kB 70.1 kB
app-route.ru..prod.js gzip 48.7 kB 48.7 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.2 kB 43.2 kB
pages-api-tu..prod.js gzip 32.9 kB 32.9 kB
pages-api.ru...dev.js gzip 43.1 kB 43.1 kB
pages-api.ru..prod.js gzip 32.8 kB 32.8 kB
pages-turbo....dev.js gzip 52.5 kB 52.5 kB
pages-turbo...prod.js gzip 39.4 kB 39.4 kB
pages.runtim...dev.js gzip 52.5 kB 52.5 kB
pages.runtim..prod.js gzip 39.3 kB 39.3 kB
server.runti..prod.js gzip 62.7 kB 62.7 kB
Total 2.8 MB 2.8 MB ⚠️ +3 B

@lukesandberg lukesandberg force-pushed the import_with_type_text_turbopack branch from f5b9826 to 4f31ce0 Compare February 7, 2026 08:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team. tests Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants