Skip to content

Commit 82e99e1

Browse files
authored
Add Node ESM Loader and Register Entrypoints (#20274)
* Add Node ESM loader build This adds a loader build as a first-class export. This will grow in complexity so it deserves its own module. * Add Node CommonJS regiter build This adds a build as a first-class export for legacy CommonJS registration in Node.js. This will grow in complexity so it deserves its own module. * Simplify fixture a bit to easier show usage with or without esm * Bump es version We leave async function in here which are newer than ES2015.
1 parent bf7b7ae commit 82e99e1

18 files changed

+181
-84
lines changed

fixtures/flight/loader/index.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {resolve, getSource} from 'react-transport-dom-webpack/node-loader';
2+
3+
export {resolve, getSource};
4+
5+
import babel from '@babel/core';
6+
7+
const babelOptions = {
8+
babelrc: false,
9+
ignore: [/\/(build|node_modules)\//],
10+
plugins: [
11+
'@babel/plugin-syntax-import-meta',
12+
'@babel/plugin-transform-react-jsx',
13+
],
14+
};
15+
16+
export async function transformSource(source, context, defaultTransformSource) {
17+
const {format} = context;
18+
if (format === 'module') {
19+
const opt = Object.assign({filename: context.url}, babelOptions);
20+
const {code} = await babel.transformAsync(source, opt);
21+
return {source: code};
22+
}
23+
return defaultTransformSource(source, context, defaultTransformSource);
24+
}

fixtures/flight/loader/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}

fixtures/flight/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"prebuild": "cp -r ../../build/node_modules/* ./node_modules/",
6868
"start": "concurrently \"npm run start:server\" \"npm run start:client\"",
6969
"start:client": "node scripts/start.js",
70-
"start:server": "NODE_ENV=development node --experimental-loader ./server/loader.mjs server",
70+
"start:server": "NODE_ENV=development node --experimental-loader ./loader/index.js server",
7171
"start:prod": "node scripts/build.js && NODE_ENV=production node server",
7272
"build": "node scripts/build.js",
7373
"test": "node scripts/test.js --env=jsdom"

fixtures/flight/server/handler.server.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,26 @@
22

33
import {pipeToNodeWritable} from 'react-transport-dom-webpack/server';
44
import * as React from 'react';
5-
import App from '../src/App.server';
65

7-
module.exports = function(req, res) {
6+
import url from 'url';
7+
8+
function resolve(path) {
9+
return url.pathToFileURL(require.resolve(path)).href;
10+
}
11+
12+
module.exports = async function(req, res) {
813
res.setHeader('Access-Control-Allow-Origin', '*');
14+
const m = await import('../src/App.server.js');
15+
// const m = require('../src/App.server.js');
16+
const App = m.default.default || m.default;
917
pipeToNodeWritable(<App />, res, {
1018
// TODO: Read from a map on the disk.
11-
[require.resolve('../src/Counter.client.js')]: {
19+
[resolve('../src/Counter.client.js')]: {
1220
id: './src/Counter.client.js',
1321
chunks: ['1'],
1422
name: 'default',
1523
},
16-
[require.resolve('../src/ShowMore.client.js')]: {
24+
[resolve('../src/ShowMore.client.js')]: {
1725
id: './src/ShowMore.client.js',
1826
chunks: ['2'],
1927
name: 'default',

fixtures/flight/server/handler.server.mjs

Lines changed: 0 additions & 27 deletions
This file was deleted.

fixtures/flight/server/index.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
'use strict';
22

3-
require.extensions['.client.js'] = function(module, path) {
4-
module.exports = {
5-
$$typeof: Symbol.for('react.module.reference'),
6-
name: path,
7-
};
8-
};
3+
const register = require('react-transport-dom-webpack/node-register');
4+
register();
95

106
const babelRegister = require('@babel/register');
117

@@ -25,8 +21,7 @@ app.get('/', function(req, res) {
2521
delete require.cache[key];
2622
}
2723
}
28-
import('./handler.server.mjs').then(m => m.default(req, res));
29-
// require('./handler.server.js')(req, res);
24+
require('./handler.server.js')(req, res);
3025
});
3126

3227
app.listen(3001, () => {

fixtures/flight/server/loader.mjs

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from '../src/ReactFlightWebpackNodeLoader.js';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from './src/ReactFlightWebpackNodeRegister';

0 commit comments

Comments
 (0)