Repository navigation
fix(next): deliver complete webpack CSS across compilers and cached builds - #783
Merged
Merged
Conversation
Refs #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Contributor
Changepacks@devup-ui/wasm@1.0.83 → 1.0.84 - bindings/devup-ui-wasm/package.jsonPatch
@devup-ui/bun-plugin@1.0.22 → 1.0.23 - packages/bun-plugin/package.jsonPatch
@devup-ui/components@0.1.60 → 0.1.61 - packages/components/package.jsonPatch
@devup-ui/eslint-plugin@1.0.22 → 1.0.23 - packages/eslint-plugin/package.jsonPatch
@devup-ui/next-plugin@1.0.90 → 1.0.91 - packages/next-plugin/package.jsonPatch
@devup-ui/plugin-utils@1.0.17 → 1.0.18 - packages/plugin-utils/package.jsonPatch
@devup-ui/react@1.0.44 → 1.0.45 - packages/react/package.jsonPatch
@devup-ui/reset-css@1.0.31 → 1.0.32 - packages/reset-css/package.jsonPatch
@devup-ui/rsbuild-plugin@1.0.67 → 1.0.68 - packages/rsbuild-plugin/package.jsonPatch
@devup-ui/vite-plugin@1.0.73 → 1.0.74 - packages/vite-plugin/package.jsonPatch
@devup-ui/webpack-plugin@1.0.71 → 1.0.72 - packages/webpack-plugin/package.jsonPatch
|
Codecov Report✅ All modified and coverable lines are covered by tests.
🚀 New features to boost your workflow:
|
owjs3901
added a commit
that referenced
this pull request
Oct 16, 2026
Refs #686; stack #784 on #783 and #781. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This was referenced Oct 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #686 (Next webpack CSS 전달). 최신 main
a6ecc125에서 분기했고 #781의fd4bb5d4를 실제 두 부모 merge23e58b86로 반영했습니다. #781이 먼저 병합되어야 합니다. #719의 변경은 이 브랜치에 포함하지 않습니다.요약
Next 16.3.6의
next build --webpack에서 서버·edge compiler가 추출한 스타일과 클래스 할당이 다음 compiler의 reset으로 지워지는 문제를 고칩니다. Next의 loader-query 진입점은 일반 파일 그래프의 진입점이 아니어서 기존 사전 추출이 비었고, 최종 클라이언트 CSS에는 서버 스타일이 없거나 SSR 클래스와 다른 클래스에 선언이 붙었습니다.Next가 결정론적으로 수집한 완전한 파일 집합을 각 compiler의 정상 reset·설정·번호 배정 뒤에 다시 추출합니다. 런타임 스타일링, 상태를 보존하는 전역 캐시, reset 생략, 의존성 추가로 우회하지 않습니다.
동작
apps/next의 실제 main webpack 빌드에서 클라이언트 스타일·테마는 남지만 서버 layout의 흰 글씨와 globalCss의 body 배경·글씨가 빠지는 것을 먼저 확인했습니다. 수정 후 같은 앱의 webpack 빌드에서 서버·클라이언트·라이브러리·테마·globalCss가 모두 복구됐습니다.productionPrewarmFiles는 진입점이 아니라 완전한 파일 목록입니다.undefined는 기존 일반 webpack의 진입점 도달 범위를 유지하고,[]를 포함한 명시적 목록은 해당 범위를 그대로 사용합니다. 경로를 정규화·중복 제거·정렬하고 외부 파일도 필터로 버리지 않습니다..next/cache/devup-ui로 안정화하며, 개발의 build-ID 경로와 명시적cssDir은 유지합니다. cache를 끄거나 넓은 정규식으로 우회하지 않습니다.부모 세션이 직접 실행한 실제 HTTP 수신 증거(정규화된 선언):
실제로 해당 문서가 링크한 위 CSS 파일의 내용 일부:
위 클래스 이름과 URL hash는 실제 receipt이며 고정된 공개 계약이나 테스트 기대값이 아닙니다. 두 모드에서 server·client·Edge HTML과 각 문서의 stylesheet를 HTTP200으로 가져와 실제 클래스마다 모든 선언을 검사하고, cold·cold-repeat·이미 채워진 warm webpack cache에서도 CSS bytes와 클래스 대응이 같음을 확인합니다.
새로 생기는 오류
명시적인 production 사전 추출 중 실제로 발생한 파일 수집·manifest·읽기·추출 오류는 더 이상 조용히 무시하고 불완전한 CSS를 내보내지 않습니다. 원래 오류를 그대로 빌드에 전달하며, 스타일 구문 오류는 기존 engine의 위치 포함 진단을 유지합니다. 일반 webpack의 기존 best-effort 경로와 watch 동작은 유지합니다.
남는 한계
edge API가 JSON으로 반환하는 클래스는 HTML 문서가 아닙니다. 기본 모드에서 그 CSS가 정적 파일에 생성되는 것과
/문서가 그 stylesheet를 링크하는 것은 별도 계약이며, API-only CSS를 root-linked로 주장하지 않습니다. 기존 App Router Edge API 회귀는 유지했고, coordinator 승인에 따라 실제 Edge HTML은 지원되는 Pages Routerexperimental-edge페이지로 검증했습니다.Windows·Next 16.3.6의 App Router Edge HTML은 Devup 설정·import를 제거한 native Next-only 대조군과 workers-off 대조군에서도 React consumer-manifest module
253/9296누락으로 HTTP500을 재현했습니다. 이 외부 Next 문제는 별도로 보고했으며 App Router Edge HTML 성공을 주장하지 않습니다. Node runtime으로 바꿔서 Edge 검증을 통과시킨 것이 아닙니다.기존 정적 그래프·공유 resolver가 지원하는 import/경로 정책을 사용합니다. 비리터럴 import, bundler 전용 사용자 resolver·조건, CJS-only 패키지에 새 지원을 약속하지 않습니다. 빌드마다 상태를 격리하며 런타임 해석으로 대체하지 않습니다.
검증
회귀 우선: 실제 Next의 두 모드 off/on/off 손실·복구 증거, 외부 barrel 누락·사전 추출 오류 무시 회귀, 실제 webpack 생성자 실패 후 부분 스타일이 다음 빌드에 새는 회귀를 수정 전에 실패시켰습니다.
실제 WASM·webpack compiler를 순서대로 생성·종료한 뒤 CSS bytes·클래스 대응이 동일하며, 다음 무관한 일반 빌드에는 이전 스타일·prefix·shorthand가 남지 않습니다. assertion 실패·비동기 shutdown 오류에서도 모든 compiler 종료를 기다린 다음 fixture를 제거하며 오류를 보존합니다.
전체 Bun 5,928 pass / 0 fail / 함수·라인 100%, 두 CSS 모드 HTTP/cache matrix와 기존 5개 Next process 소유권·실패·timeout 회귀 포함.
기본 스택·Rust 1.99의 명시적 workspace clippy
-D warnings및 Rust workspace 전체 통과. 새 WASM·루트 build와 관련 패키지 typecheck 통과.최종 정식 pre-commit hook 통과: 749.4초, peak 3,156,398,080 bytes, jobs=2·기본 스택·Rust 1.99·CI unset·12GB watchdog, lint·tarpaulin·Bun 생략 없음. 기존 lint 경고 9개 외 추가 없음. 핵심 커밋 훅도 288.9초에 통과했고, 그 첫 시도의 임시 계측 복원 줄바꿈 오류는 세 파일만 포맷 복구한 뒤 새 커밋 시도로 해결했습니다.
Windows 물리 포맷의 Rust coverage는 **98.11%(17,182/17,513)**이며 100%로 주장하지 않습니다. Linux CI의
--fail-under 100결과를 별도로 확인합니다.부모가 최종 소스에서 직접 수행한 수동 QA: 두 모드의 cold/repeat/warm 총 18개 HTML 문서, 각 문서가 실제 링크한 CSS와 클래스별 모든 선언, global/theme·외부 barrel, 깨진 HTTP 경계 5개, 실제 WASM/compiler 생성자 실패 후 빌드 격리 통과. 모든 owner가
tree_exit active=[]뒤 fixture를 제거했습니다. 브라우저 hydration·시각·computed-style 검증으로 과장하지 않습니다.experimental.webpackBuildWorker:true의 실제 서로 다른 worker PID를 관찰했으며, 옵션만 켠 것을 다중 프로세스 검증으로 간주하지 않았습니다.전체 목표·최종 코드/HTTP gate APPROVE:
W65b-delivery-ready-review.md. LSP는 설치되지 않았고 기존에 설치 거절된 상태이므로 LSP clean을 주장하지 않습니다.head:
42cb0a4e9d9f1e5eb9b4f87bfbd4ff3a000183da(핵심 수정b1dc9465, cache 수정·HTTP 회귀42cb0a4e). 정상 push했고, 측정 context 416.7K(06:17:49Z)입니다.최종 CI 38858583003 success: 정확히 위 head의 publish·benchmark·landing-next-e2e·vinext-rsc-css-e2e 및 Codecov/patch 모두 성공. Linux Rust 100.00%(12,393/12,393), 전체 Bun 5,928 pass/0 fail/함수·라인 100%, preload race 8/0, 두 모드 HTTP/cache·기존 fault 회귀와 landing/RSC e2e를 통과했습니다.
2026-10-17: main(b4c143b, 1차 묶음 fix(next): support JavaScript JSX and webpack source map objects #781·fix(extractor): compose styled extensions, merge attrs and let later JSX spreads win #707~fix(extractor): forward refs from generated styled components #722·fix(react,components): support React 18 peers and drop React 19-only APIs #720·fix(components): forward refs from the UI kit form components #721 병합 후)을 병합했습니다. #781과 main 사이에 merge base가 두 개라 GitHub가 충돌로 표시했지만 실제 내용 충돌은 없어 자동 병합되었습니다(코드 변경 없음).