Skip to content

Commit 35a6aae

Browse files
Romex91alexeyrJudahmeek
authored
Reduce bundle size (#1697)
* split exports to 'react-on-rails/server' and 'react-on-rails/client' * es2015 => es2020 * Revert module system to CJS for now --------- Co-authored-by: Alexey Romanov <[email protected]> Co-authored-by: Judah Meek <[email protected]>
1 parent 2d5a529 commit 35a6aae

12 files changed

+52
-20
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ yalc.lock
3535

3636
# IDE
3737
.idea/
38+
.vscode/
3839

3940
# TypeScript
4041
*.tsbuildinfo

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ Please follow the recommendations outlined at [keepachangelog.com](http://keepac
1818
### [Unreleased]
1919
Changes since the last non-beta release.
2020

21+
#### Added
22+
- Add export option 'react-on-rails/client' to avoid shipping server-rendering code to browsers (~5KB improvement) [PR 1697](https://github.com/shakacode/react_on_rails/pull/1697) by [Romex91](https://github.com/Romex91).
23+
2124
#### Fixed
2225
- Fix obscure errors by introducing FULL_TEXT_ERRORS [PR 1695](https://github.com/shakacode/react_on_rails/pull/1695) by [Romex91](https://github.com/Romex91).
2326
- Disable `esModuleInterop` to increase interoperability [PR 1699](https://github.com/shakacode/react_on_rails/pull/1699) by [alexeyr-ci](https://github.com/alexeyr-ci).

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* After updating code via Git, to prepare all examples:
1010
```sh
1111
cd react_on_rails/
12-
bundle && yarn && rake examples:gen_all && rake node_package && rake
12+
bundle && yarn && rake shakapacker_examples:gen_all && rake node_package && rake
1313
```
1414

1515
See [Dev Initial Setup](#dev-initial-setup) below for, well... initial setup,

node_package/src/ReactOnRails.ts renamed to node_package/src/ReactOnRails.client.ts

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
import type { ReactElement } from 'react';
22

33
import * as ClientStartup from './clientStartup';
4-
import handleError from './handleError';
54
import ComponentRegistry from './ComponentRegistry';
65
import StoreRegistry from './StoreRegistry';
7-
import serverRenderReactComponent from './serverRenderReactComponent';
86
import buildConsoleReplay from './buildConsoleReplay';
97
import createReactOutput from './createReactOutput';
108
import Authenticity from './Authenticity';
119
import context from './context';
1210
import type {
1311
RegisteredComponent,
14-
RenderParams,
1512
RenderResult,
1613
RenderReturnType,
17-
ErrorOptions,
1814
ReactComponentOrRenderFunction,
1915
AuthenticityHeaders,
2016
Store,
@@ -243,8 +239,8 @@ ctx.ReactOnRails = {
243239
* Used by server rendering by Rails
244240
* @param options
245241
*/
246-
serverRenderReactComponent(options: RenderParams): null | string | Promise<RenderResult> {
247-
return serverRenderReactComponent(options);
242+
serverRenderReactComponent(): null | string | Promise<RenderResult> {
243+
throw new Error('serverRenderReactComponent is not available in "react-on-rails/client". Import "react-on-rails" server-side.');
248244
},
249245

250246
/**
@@ -259,8 +255,8 @@ ctx.ReactOnRails = {
259255
* Used by Rails to catch errors in rendering
260256
* @param options
261257
*/
262-
handleError(options: ErrorOptions): string | undefined {
263-
return handleError(options);
258+
handleError(): string | undefined {
259+
throw new Error('handleError is not available in "react-on-rails/client". Import "react-on-rails" server-side.');
264260
},
265261

266262
/**

node_package/src/ReactOnRails.full.ts

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import handleError from './handleError';
2+
import serverRenderReactComponent from './serverRenderReactComponent';
3+
import type {
4+
RenderParams,
5+
RenderResult,
6+
ErrorOptions,
7+
} from './types';
8+
9+
import Client from './ReactOnRails.client';
10+
11+
if (typeof window !== 'undefined') {
12+
console.log('Optimization opportunity: "react-on-rails" includes ~14KB of server-rendering code. Browsers may not need it. See https://forum.shakacode.com/t/how-to-use-different-versions-of-a-file-for-client-and-server-rendering/1352 (Requires creating a free account)');
13+
}
14+
15+
/**
16+
* Used by Rails to catch errors in rendering
17+
* @param options
18+
*/
19+
Client.handleError = (options: ErrorOptions): string | undefined => handleError(options);
20+
21+
/**
22+
* Used by server rendering by Rails
23+
* @param options
24+
*/
25+
Client.serverRenderReactComponent = (options: RenderParams): null | string | Promise<RenderResult> => serverRenderReactComponent(options);
26+
27+
export * from "./types";
28+
export default Client;

node_package/src/ReactOnRails.node.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import ReactOnRails from './ReactOnRails';
1+
import ReactOnRails from './ReactOnRails.full';
22
import streamServerRenderedReactComponent from './streamServerRenderedReactComponent';
33

44
ReactOnRails.streamServerRenderedReactComponent = streamServerRenderedReactComponent;
55

6-
export * from './ReactOnRails';
7-
export { default } from './ReactOnRails';
6+
export * from './ReactOnRails.full';
7+
export { default } from './ReactOnRails.full';

node_package/tests/Authenticity.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import ReactOnRails from '../src/ReactOnRails';
1+
import ReactOnRails from '../src/ReactOnRails.client';
22

33
const testToken = 'TEST_CSRF_TOKEN';
44

node_package/tests/ReactOnRails.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { createStore } from 'redux';
77
import * as React from 'react';
88
import * as createReactClass from 'create-react-class';
9-
import ReactOnRails from '../src/ReactOnRails';
9+
import ReactOnRails from '../src/ReactOnRails.client';
1010

1111
describe('ReactOnRails', () => {
1212
expect.assertions(14);

package-scripts.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ scripts:
2525
# 3. Check if the project is built now;
2626
# 4. If it failed, print an error message (still follow https://docs.npmjs.com/cli/v8/using-npm/scripts#best-practices).
2727
script: >
28-
[ -f node_package/lib/ReactOnRails.js ] ||
28+
[ -f node_package/lib/ReactOnRails.full.js ] ||
2929
(npm run build >/dev/null 2>&1 || true) &&
30-
[ -f node_package/lib/ReactOnRails.js ] ||
30+
[ -f node_package/lib/ReactOnRails.full.js ] ||
3131
{ echo 'Building react-on-rails seems to have failed!'; }
3232
3333
format:

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
"exports": {
77
".": {
88
"node": "./node_package/lib/ReactOnRails.node.js",
9-
"default": "./node_package/lib/ReactOnRails.js"
10-
}
9+
"default": "./node_package/lib/ReactOnRails.full.js"
10+
},
11+
"./client": "./node_package/lib/ReactOnRails.client.js"
1112
},
1213
"directories": {
1314
"doc": "docs"

spec/dummy/client/app/packs/client-bundle.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'jquery';
44
import 'jquery-ujs';
55
import '@hotwired/turbo-rails';
66

7-
import ReactOnRails from 'react-on-rails';
7+
import ReactOnRails from 'react-on-rails/client';
88

99
import HelloTurboStream from '../startup/HelloTurboStream';
1010
import SharedReduxStore from '../stores/SharedReduxStore';

tsconfig.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
"esModuleInterop": false,
66
// needed for Jest tests even though we don't use .tsx
77
"jsx": "react-jsx",
8+
"lib": ["dom", "es2020"],
9+
"module": "node16",
810
"noImplicitAny": true,
911
"outDir": "node_package/lib",
1012
"strict": true,
11-
"incremental": true
13+
"incremental": true,
14+
"target": "es2020"
1215
},
1316
"include": ["node_package/src/**/*"]
1417
}

0 commit comments

Comments
 (0)