Skip to content

Commit

Permalink
Setup require hook in next-server for styled-jsx resolving (#39305)
Browse files Browse the repository at this point in the history
* Use require hook and alias to resolve styled-jsx

* re-export styled-jsx types from compiled

* fix lint

* add test for styled-jsx css

* setup require hook in server

* compile import path to styled-jsx/style

* revert require hook

* add test for server styled-jsx resolving

* update test

* pre copy styled-jsx assets

* fix styled-jsx dts

* add npmrc for styled-jsx e2e test

* load require hook directly

* rm legacy test

* fix lint

* fix pnpm install error

* split require hook

* only alias styled-jsx

* make styled-jsx resolving statically analyzable

* update test

Co-authored-by: JJ Kasper <jj@jjsweb.site>
  • Loading branch information
huozhi and ijjk committed Aug 9, 2022
1 parent b0f5901 commit 71f5f25
Show file tree
Hide file tree
Showing 85 changed files with 367 additions and 365 deletions.
1 change: 0 additions & 1 deletion package.json
Expand Up @@ -192,7 +192,6 @@
"semver": "7.3.7",
"shell-quote": "1.7.3",
"styled-components": "5.3.3",
"styled-jsx": "link:packages/next/node_modules/styled-jsx",
"styled-jsx-plugin-postcss": "3.0.2",
"tailwindcss": "1.1.3",
"taskr": "1.1.0",
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default function Foo() {
return /*#__PURE__*/ React.createElement("div", {
render: function(v) {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-swc/crates/styled_jsx/src/utils.rs
Expand Up @@ -310,7 +310,7 @@ pub fn styled_jsx_import_decl(style_import_name: &str) -> ModuleItem {
})],
src: Str {
span: DUMMY_SP,
value: "next/dist/shared/lib/styled-jsx".into(),
value: "styled-jsx/style".into(),
raw: None,
},
}))
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const Component = ()=><>
<header >
<Comp >
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default {
styles: <_JSXStyle id={"71f03d42ea0ec6"}>{".container.jsx-71f03d42ea0ec6{background:#000;color:white;font-weight:700;height:100px}"}</_JSXStyle>,
className: "jsx-71f03d42ea0ec6"
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=>{
const Element = 'div';
return <div className={"jsx-abb4c2202db1a207"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import styles from './styles';
const styles2 = require('./styles2');
// external only
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={"jsx-b2b86d63f35d25ee"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={"jsx-1952086b0a5ae64c"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const Test = ()=><div className={"jsx-a9535d7d5f32c3c4"}>

<span className={"jsx-a9535d7d5f32c3c4"}>test</span>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
function NavigationItem({ active , className , }) {
return <span className={"jsx-2342aae4628612c6" + " " + (cn({
active
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (({ children })=><div className={`jsx-${styles.__hash}`}>

<p className={`jsx-${styles.__hash}`}>{children}</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const color = 'red';
const otherColor = 'green';
const A = ()=><div className={"jsx-551210e97e875d0e"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
const Element = 'div';
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import styles from './styles2';
export default (({ level =1 })=>{
const Element = `h${level}`;
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (({ level =1 })=>{
const Element = `h${level}`;
return <Element className={"jsx-fca64cc3f069b519" + " " + "root"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const darken = (c)=>c;
const color = 'red';
const otherColor = 'green';
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
function test() {
({
styles: <_JSXStyle id={"abb4c2202db1a207"}>{"div.jsx-abb4c2202db1a207{color:red}"}</_JSXStyle>,
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import styles, { foo as styles3 } from './styles';
const styles2 = require('./styles2');
export default (()=><div >
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import styles from './styles';
export default (()=><div className={`jsx-${styles.__hash}`}>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import styles from './styles';
const styles2 = require('./styles2');
import { foo as styles3 } from './styles';
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import React from 'react';
export default (()=><>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const Test = ()=><div className={"jsx-5a206f122d1cb32e"}>

<span className={"jsx-5a206f122d1cb32e"}>test</span>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default function IndexPage() {
return <div className={"jsx-b6abd0684ba81871"}>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const Test = ()=><div className={"jsx-d47d6adadf14e957"}>

<_JSXStyle id={"d47d6adadf14e957"}>{"body{color:red}:hover{color:red;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-animation:foo 1s ease-out;-moz-animation:foo 1s ease-out;-o-animation:foo 1s ease-out;animation:foo 1s ease-out}div a{display:none}[data-test]>div{color:red}"}</_JSXStyle>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (({ breakPoint })=><div className={_JSXStyle.dynamic([
[
"5d2a0e645566ce9c",
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default function IndexPage() {
return <div className={"jsx-bbdada4ef17d18ef"}>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const Test = ()=><_JSXStyle id={"94239b6d6b42c9b5"}>{"p{color:red}"}</_JSXStyle>;
export default (()=><div className={"jsx-3822e6e1fb9fa41a"}>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
const attrs = {
id: 'test'
};
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-94239b6d6b42c9b5"}>

<p className={"jsx-94239b6d6b42c9b5"}>woot</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import Link from "next/link";
export default function IndexPage() {
return <div className={"jsx-9a4b3442d519aae9"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-c7c3a8e231c9215a"}>

<p className={"jsx-c7c3a8e231c9215a"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-94239b6d6b42c9b5"}>

<p className={"jsx-94239b6d6b42c9b5"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
import colors, { size } from './constants';
const color = 'red';
const bar = new String("div.jsx-aaed0341accea8f{font-size:3em}");
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export const Red = ({ Component ='button' , })=>{
return <Component className={_JSXStyle.dynamic([
[
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={"jsx-1f6cef12199c3a8f"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default function Home({ fontFamily }) {
return <div className={_JSXStyle.dynamic([
[
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-53fd644ab080300c"}>

<p className={"jsx-53fd644ab080300c"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-1f7963ae04c6466a"}>

<p className={"jsx-1f7963ae04c6466a"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-1a19bb4817c105dd"}>

<p className={"jsx-1a19bb4817c105dd"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-938ca197692ef624"}>

<p className={"jsx-938ca197692ef624"}>test</p>
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

@@ -1,4 +1,4 @@
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import _JSXStyle from "styled-jsx/style";
export default (()=><div className={"jsx-94239b6d6b42c9b5"}>

<p className={"jsx-94239b6d6b42c9b5"}>test</p>
Expand Down
6 changes: 3 additions & 3 deletions packages/next/build/babel/preset.ts
Expand Up @@ -16,7 +16,7 @@ type StyledJsxBabelOptions =
// Resolve styled-jsx plugins
function styledJsxOptions(options: StyledJsxBabelOptions) {
options = options || {}
options.styleModule = 'next/dist/shared/lib/styled-jsx'
options.styleModule = 'styled-jsx/style'

if (!Array.isArray(options.plugins)) {
return options
Expand Down Expand Up @@ -185,8 +185,8 @@ export default (
],
[
isTest && options['styled-jsx'] && options['styled-jsx']['babel-test']
? require('styled-jsx/babel-test')
: require('styled-jsx/babel'),
? require('next/dist/styled-jsx/babel-test')
: require('next/dist/styled-jsx/babel'),
styledJsxOptions(options['styled-jsx']),
],
require('./plugins/amp-attributes'),
Expand Down
3 changes: 3 additions & 0 deletions packages/next/build/utils.ts
@@ -1,6 +1,7 @@
import type { NextConfigComplete } from '../server/config-shared'

import '../server/node-polyfill-fetch'
import loadRequireHook from '../build/webpack/require-hook'
import chalk from 'next/dist/compiled/chalk'
import getGzipSize from 'next/dist/compiled/gzip-size'
import textTable from 'next/dist/compiled/text-table'
Expand Down Expand Up @@ -59,6 +60,8 @@ const fsStat = (file: string) => {
return (fileStats[file] = fileSize(file))
}

loadRequireHook()

export interface PageInfo {
isHybridAmp?: boolean
size: number
Expand Down
6 changes: 4 additions & 2 deletions packages/next/build/webpack-config.ts
Expand Up @@ -685,6 +685,8 @@ export default async function getBaseWebpackConfig(
'react-dom/server$': `${reactDomDir}/server`,
'react-dom/server.browser$': `${reactDomDir}/server.browser`,
'react-dom/client$': `${reactDomDir}/client`,
'styled-jsx/style$': require.resolve(`next/dist/styled-jsx/style`),
'styled-jsx$': require.resolve(`next/dist/styled-jsx`),

...customAppAliases,
...customErrorAlias,
Expand Down Expand Up @@ -860,11 +862,11 @@ export default async function getBaseWebpackConfig(
const isEsmRequested = dependencyType === 'esm'

const isLocalCallback = (localRes: string) => {
// Makes sure dist/shared and dist/server are not bundled
// Makes sure dist/styled-jsx, dist/shared and dist/server are not bundled
// we need to process shared `router/router` and `dynamic`,
// so that the DefinePlugin can inject process.env values
const isNextExternal =
/next[/\\]dist[/\\](shared|server)[/\\](?!lib[/\\](router[/\\]router|dynamic))/.test(
/next[/\\]dist[/\\](styled-jsx|shared|server)[/\\](?!lib[/\\](router[/\\]router|dynamic))/.test(
localRes
)

Expand Down

0 comments on commit 71f5f25

Please sign in to comment.