3.40.28 • Published 3 days ago

@tramvai/module-render v3.40.28

Weekly downloads
-
License
Apache-2.0
Repository
github
Last release
3 days ago

RenderModule

Module for rendering React application on the server and in the browser

Overview

init command

Module contains the logic for generating HTML pages, starting from getting current page component, and finishing with the rendering result HTML using the @tinkoff/htmlpagebuilder library.

This module includes code for creating top-level React component with all necessary providers composition, and page and layout components from the current route.

Installation

You need to install @tramvai/module-render

npm install @tramvai/module-render

And connect to the project

import { createApp } from '@tramvai/core';
import { RenderModule } from '@tramvai/module-render';

createApp({
  name: 'tincoin',
  modules: [RenderModule],
});

Explanation

React Strict Mode

More information about Strict Mode can be found in the official documentation.

To set the mode, you must pass the useStrictMode parameter when initializing the RenderModule.

RenderModule.forRoot({ useStrictMode: true });

Application static assets

For static assets (JS, CSS, fonts, etc.) we create special resources registry module, which allow to provide in DI list of resources, and then render them to specifics slots in final HTML.

Example:

createApp({
  providers: [
    {
      multi: true,
      useValue: [
        {
          type: ResourceType.inlineScript, // inlineScript wrap payload in tag <script>
          slot: ResourceSlot.HEAD_CORE_SCRIPTS, // define position where in HTML will be included resource
          payload: 'alert("render")',
        },
        {
          type: ResourceType.asIs, // asIs just add payload as a string, without special processing
          slot: ResourceSlot.BODY_TAIL,
          payload: '<div>hello from render slots</div>',
        },
      ],
    },
  ],
});
  • type - presets for different resources types
  • slot - slot in HTML where resource will be included
  • payload - information that will be rendered

@inline src/server/constants/slots.ts

@inline src/server/htmlPageSchema.ts

How to add assets loading to a page

Automatic resource inlining

Concept

A large number of resource files creates problems when loading the page, because the browser has to create a lot of connections to small files

Solution

To optimize page loading, we've added the ability to include some resources directly in the incoming HTML from the server. To avoid inlining everything at all, we've added the ability to set an upper limit for file size.

Connection and configuration

Since version 0.60.7 inlining for styles is enabled by default, CSS files smaller than 40kb before gzip (+-10kb after gzip) are inlined. To override these settings, add a provider specifying types of resources to be inlined (styles and/or scripts) and an upper limit for file size (in bytes, before gzip):

import { RESOURCE_INLINE_OPTIONS } from '@tramvai/tokens-render';
import { ResourceType } from '@tramvai/tokens-render';
import { provide } from '@tramvai/core';

provide({
  provide: RESOURCE_INLINE_OPTIONS,
  useValue: {
    types: [ResourceType.script, ResourceType.style], // Turn on for a CSS and JS files
    threshold: 1024, // 1kb unzipped
  },
}),

Peculiarities

All scripts and styles (depending on the settings) registered through the ResourcesRegistry are inlined.

File uploading to the server occurs in lazy mode, asynchronously. This means that there will be no inlining when the page first loads. It also means that there is no extra waiting for resources to load on the server side. Once the file is in the cache it will be inline. The cache has a TTL of 30 minutes and there is no resetting of the cache.

Automatic resource preloading

To speed up data loading, we've added a preloading system for resources and asynchronous chunks, which works according to the following scenario:

  • After rendering the application, we get information about all the CSS, JS bundles and asynchronous chunks used in the application
  • Next we add all the CSS to the preload tag and add onload event on them. We need to load the blocking resources as quickly as possible.
  • When loading any CSS file, onload event will be fired (only once time) and add all preload tags to the necessary JS files

Basic layout

The RenderModule has a default basic layout that supports different ways of extending and adding functionality

Read more about layout on the library page

Adding a basic header and footer

The module allows you to add header and footer components, which will be rendered by default for all pages

Via provider

Register header and footer components through providers:

import { DEFAULT_HEADER_COMPONENT, DEFAULT_FOOTER_COMPONENT } from '@tramvai/tokens-render';
import { provide } from '@tramvai/core';

createApp({
  providers: [
    provide({
      provide: DEFAULT_HEADER_COMPONENT,
      useValue: DefaultHeader,
    }),
    provide({
      provide: DEFAULT_FOOTER_COMPONENT,
      useValue: DefaultFooter,
    }),
  ],
});
Via bundle

You can register a headerDefault and footerDefault component in the bundle, which will be rendered for all routes that do not have headerComponent and footerComponent redefined in configuration:

createBundle({
  name: 'common-bundle',
  components: {
    headerDefault: CustomHeader,
    footerDefault: CustomFooter,
  },
});

Adding components and wrappers

You can add custom components and wrappers for layout via the token LAYOUT_OPTIONS

import { provide } from '@tramvai/core';
@Module({
  providers: [
    provide({
      provide: 'LAYOUT_OPTIONS',
      multi: true,
      useValue: {
        // React components
        components: {
          // content component, this component wraps the header, page and footer
          content: Content,
          // page component
          page: Page,

          // any global components
          alerts: Alerts,
          feedback: Feedback,
        },
        // HOC's for components
        wrappers: {
          layout: layoutWrapper,
          alerts: [alertWrapper1, alertWrapper2],
        },
      },
    }),
  ],
})
export class MyLayoutModule {}

More details about the components and wrappers options can be found in @tinkoff/layout-factory

Replacing the basic layout

If the basic layout doesn't work for you, you can replace it with any other React component. In doing so, you need to implement all the wrappers yourself and plug in global components if you need them.

You can replace it in two ways:

Add layoutComponent to route

You can add a layoutComponent property to route config and register component in bundle. This layout will be rendered when you go to the corresponding route.

createBundle({
  name: 'common-bundle',
  components: {
    myCustomLayout: CustomLayout,
  },
});
Replace layoutDefault

You can register a layoutDefault component in bundle, which will be automatically rendered for all routes that do not have an layoutComponent in config property.

createBundle({
  name: 'common-bundle',
  components: {
    layoutDefault: CustomLayout,
  },
});

How to

How to add assets loading to a page

There are 2 main ways how you can add resources to your application

  • The RENDER_SLOTS token, where you can pass a list of resources, such as HTML markup, inline scripts, script tag
  • Token RESOURCES_REGISTRY to get the resource manager, and register the desired resources manually

Example:

@inline ../../../examples/how-to/render-add-resources/index.tsx

React 18 concurrent features

tramvai will automatically detect React version, and use hydrateRoot API on the client for 18+ version.

Before switch to React 18, we recommended to activate Strict Mode in your application. In Strict Mode which React warns about using the legacy API.

To connect, you must configure the RenderModule:

modules: [
  RenderModule.forRoot({ useStrictMode: true })
]

Testing

Testing render extensions via RENDER_SLOTS or RESOURCES_REGISTRY tokens

If you have a module or providers that define RENDER_SLOTS or use RESOURCES_REGISTRY, it is convenient to use special utilities to test them separately

import {
  RENDER_SLOTS,
  ResourceSlot,
  RESOURCES_REGISTRY,
  ResourceType,
} from '@tramvai/tokens-render';
import { testPageResources } from '@tramvai/module-render/tests';
import { CustomModule } from './module';
import { providers } from './providers';

describe('testPageResources', () => {
  it('modules', async () => {
    const { render } = testPageResources({
      modules: [CustomModule],
    });
    const { head } = render();

    expect(head).toMatchInlineSnapshot(`
"
<meta charset=\\"UTF-8\\">
<script>console.log(\\"from module!\\")</script>
"
`);
  });

  it('providers', async () => {
    const { render, runLine } = testPageResources({
      providers,
    });

    expect(render().body).toMatchInlineSnapshot(`
"
"
  `);

    await runLine(commandLineListTokens.resolvePageDeps);

    expect(render().body).toMatchInlineSnapshot(`
"
<script defer=\\"defer\\" charset=\\"utf-8\\" crossorigin=\\"anonymous\\" src=\\"https://scripts.org/script.js\\"></script>
<span>I\`m body!!!</span>
"
  `);
  });
});

Exported tokens

link

4.9.0

3 days ago

3.40.28

7 days ago

4.8.6

7 days ago

3.40.26

8 days ago

3.40.25

8 days ago

4.8.4

8 days ago

4.8.3

8 days ago

3.40.21

12 days ago

4.7.1

12 days ago

3.40.20

13 days ago

4.7.0

12 days ago

4.4.6

17 days ago

3.40.17

17 days ago

4.4.5

18 days ago

4.4.4

18 days ago

3.40.16

18 days ago

4.4.1

19 days ago

4.4.3

19 days ago

3.40.14

19 days ago

3.40.13

19 days ago

4.3.1

20 days ago

3.40.11

20 days ago

4.3.0

22 days ago

3.40.6

24 days ago

3.40.7

24 days ago

4.2.1

24 days ago

4.2.0

24 days ago

4.1.0

24 days ago

4.0.6

27 days ago

3.40.5

26 days ago

4.0.5

1 month ago

4.0.4

1 month ago

3.40.4

1 month ago

3.38.0

1 month ago

3.37.10

1 month ago

3.37.8

2 months ago

3.37.7

2 months ago

3.37.5

2 months ago

3.37.1

2 months ago

3.34.0

3 months ago

3.33.2

3 months ago

3.33.0

3 months ago

3.32.3

3 months ago

3.31.0

3 months ago

3.31.2

3 months ago

3.31.3

3 months ago

3.30.1

3 months ago

3.27.5

3 months ago

3.27.3

3 months ago

3.27.4

3 months ago

3.27.0

4 months ago

3.26.3

4 months ago

3.26.2

4 months ago

3.25.5

4 months ago

3.25.6

4 months ago

3.25.3

4 months ago

3.25.2

4 months ago

3.24.3

4 months ago

3.25.0

4 months ago

3.24.1

4 months ago

3.24.0

4 months ago

3.23.0

5 months ago

3.21.0

5 months ago

3.19.0

5 months ago

3.19.1

5 months ago

3.17.0

5 months ago

2.160.25

5 months ago

3.15.1

5 months ago

3.16.0

5 months ago

3.12.0

5 months ago

3.14.1

5 months ago

3.14.0

5 months ago

3.13.0

5 months ago

3.10.2

5 months ago

3.11.0

5 months ago

2.139.3

8 months ago

2.139.2

8 months ago

3.2.0

6 months ago

2.149.0

8 months ago

2.149.1

8 months ago

2.160.21

5 months ago

2.160.12

6 months ago

2.160.17

6 months ago

2.160.19

6 months ago

2.160.10

6 months ago

2.118.1

10 months ago

3.0.2

6 months ago

3.0.0

6 months ago

2.130.10

9 months ago

2.117.4

10 months ago

2.130.11

9 months ago

2.117.2

10 months ago

2.117.0

10 months ago

2.150.0

8 months ago

2.150.1

7 months ago

2.160.4

6 months ago

2.160.2

6 months ago

2.160.1

7 months ago

2.119.5

10 months ago

2.119.4

10 months ago

2.119.3

10 months ago

2.119.2

10 months ago

2.119.0

10 months ago

3.5.0

6 months ago

3.4.1

6 months ago

2.152.2

7 months ago

2.152.3

7 months ago

2.152.1

7 months ago

3.4.6

6 months ago

3.4.5

6 months ago

3.3.2

6 months ago

2.151.0

7 months ago

2.142.1

8 months ago

2.142.0

8 months ago

2.154.0

7 months ago

2.141.2

8 months ago

2.141.1

8 months ago

2.130.9

9 months ago

2.130.7

9 months ago

2.130.6

9 months ago

2.153.3

7 months ago

2.130.4

9 months ago

2.153.1

7 months ago

2.153.2

7 months ago

2.153.0

7 months ago

2.121.2

10 months ago

3.9.1

5 months ago

3.9.0

5 months ago

2.133.5

8 months ago

2.133.4

8 months ago

3.10.0

5 months ago

2.133.2

9 months ago

2.156.1

7 months ago

2.133.0

9 months ago

2.143.0

8 months ago

2.143.1

8 months ago

2.120.0

10 months ago

3.7.0

6 months ago

2.132.1

9 months ago

2.155.0

7 months ago

2.132.0

9 months ago

2.123.4

9 months ago

2.146.1

8 months ago

2.123.3

9 months ago

2.123.2

9 months ago

2.123.1

9 months ago

2.146.0

8 months ago

2.145.0

8 months ago

2.145.1

8 months ago

2.122.0

10 months ago

2.134.0

8 months ago

2.125.4

9 months ago

2.148.1

8 months ago

2.125.3

9 months ago

2.125.2

9 months ago

2.148.0

8 months ago

2.125.0

9 months ago

2.137.0

8 months ago

2.147.1

8 months ago

2.124.0

9 months ago

2.159.5

7 months ago

2.159.6

7 months ago

2.159.4

7 months ago

2.159.1

7 months ago

2.159.2

7 months ago

2.112.0

11 months ago

2.111.1

11 months ago

2.111.0

11 months ago

2.95.0

1 year ago

2.95.4

12 months ago

2.103.1

12 months ago

2.94.27

1 year ago

2.94.24

1 year ago

2.94.23

1 year ago

2.94.25

1 year ago

2.104.0

12 months ago

2.104.2

12 months ago

2.104.3

12 months ago

2.104.4

12 months ago

2.106.3

11 months ago

2.106.4

11 months ago

2.106.5

11 months ago

2.105.0

12 months ago

2.110.0

11 months ago

2.106.2

12 months ago

2.108.1

11 months ago

2.109.0

11 months ago

2.109.1

11 months ago

2.98.2

12 months ago

2.98.0

12 months ago

2.100.0

12 months ago

2.108.0

11 months ago

2.97.2

12 months ago

2.97.0

12 months ago

2.101.0

12 months ago

2.101.1

12 months ago

2.102.1

12 months ago

2.94.17

1 year ago

2.94.16

1 year ago

2.94.2

1 year ago

2.94.19

1 year ago

2.94.18

1 year ago

2.94.13

1 year ago

2.94.12

1 year ago

2.94.6

1 year ago

2.94.15

1 year ago

2.94.4

1 year ago

2.94.9

1 year ago

2.94.7

1 year ago

2.94.8

1 year ago

2.94.0

1 year ago

2.79.9

1 year ago

2.79.7

1 year ago

2.79.6

1 year ago

2.79.5

1 year ago

2.79.4

1 year ago

2.82.0

1 year ago

2.93.0

1 year ago

2.78.2

1 year ago

2.78.1

1 year ago

2.89.2

1 year ago

2.92.1

1 year ago

2.77.0

1 year ago

2.92.0

1 year ago

2.76.2

1 year ago

2.91.1

1 year ago

2.87.0

1 year ago

2.90.0

1 year ago

2.85.1

1 year ago

2.84.0

1 year ago

2.84.2

1 year ago

2.75.0

1 year ago

2.74.0

1 year ago

2.73.1

1 year ago

2.73.0

1 year ago

2.72.0

1 year ago

2.72.5

1 year ago

2.72.4

1 year ago

2.72.3

1 year ago

2.67.1

1 year ago

2.70.1

1 year ago

2.70.0

1 year ago

2.67.0

1 year ago

2.66.0

1 year ago

2.66.2

1 year ago

2.66.3

1 year ago

2.65.9

1 year ago

2.56.0

1 year ago

2.56.5

1 year ago

2.56.1

1 year ago

2.56.2

1 year ago

2.64.0

1 year ago

2.49.5

1 year ago

2.49.2

1 year ago

2.49.3

1 year ago

2.49.0

1 year ago

2.63.0

1 year ago

2.48.3

1 year ago

2.48.0

1 year ago

2.51.2

1 year ago

2.51.0

1 year ago

2.51.1

1 year ago

2.59.2

1 year ago

2.59.3

1 year ago

2.59.4

1 year ago

2.59.0

1 year ago

2.50.0

1 year ago

2.61.1

1 year ago

2.61.2

1 year ago

2.34.0

2 years ago

2.45.0

1 year ago

2.45.1

1 year ago

2.33.1

2 years ago

2.33.3

2 years ago

2.33.2

2 years ago

2.44.2

1 year ago

2.32.0

2 years ago

2.31.0

2 years ago

2.39.0

1 year ago

2.39.3

1 year ago

2.39.2

1 year ago

2.37.3

2 years ago

2.37.1

2 years ago

2.37.0

2 years ago

2.40.0

1 year ago

2.36.0

2 years ago

2.47.3

1 year ago

2.47.0

1 year ago

2.47.2

1 year ago

2.47.1

1 year ago

2.35.0

2 years ago

2.22.0

2 years ago

2.21.0

2 years ago

2.21.1

2 years ago

2.29.0

2 years ago

2.20.0

2 years ago

2.20.1

2 years ago

2.28.0

2 years ago

2.27.0

2 years ago

2.26.2

2 years ago

2.26.0

2 years ago

2.25.1

2 years ago

2.24.1

2 years ago

2.24.0

2 years ago

2.24.3

2 years ago

2.11.0

2 years ago

2.4.0

2 years ago

2.3.0

2 years ago

2.10.2

2 years ago

2.2.3

2 years ago

2.2.2

2 years ago

2.0.2

2 years ago

2.0.7

2 years ago

2.0.0

2 years ago

2.7.0

2 years ago

2.7.1

2 years ago

1.110.2

2 years ago

1.110.0

2 years ago

2.6.2

2 years ago

1.109.0

2 years ago

2.5.0

2 years ago

1.108.1

2 years ago

1.94.5

2 years ago

1.94.2

2 years ago

1.94.1

2 years ago

1.94.0

2 years ago

1.103.0

2 years ago

1.102.1

2 years ago

1.96.0

2 years ago

1.105.3

2 years ago

1.105.2

2 years ago

1.95.2

2 years ago

1.95.1

2 years ago

1.95.0

2 years ago

1.104.2

2 years ago

1.105.6

2 years ago

1.98.0

2 years ago

1.99.1

2 years ago

1.97.0

2 years ago

1.106.0

2 years ago

1.101.8

2 years ago

1.101.6

2 years ago

1.101.3

2 years ago

1.101.4

2 years ago

1.101.2

2 years ago

1.101.9

2 years ago

1.90.6

2 years ago

1.90.4

2 years ago

1.90.2

2 years ago

1.90.1

2 years ago

1.93.1

2 years ago

1.92.3

2 years ago

1.92.2

2 years ago

1.92.0

2 years ago

1.84.0

2 years ago

1.84.2

2 years ago

1.89.1

2 years ago

1.91.1

2 years ago

1.91.0

2 years ago

1.85.0

2 years ago

1.82.1

2 years ago

1.82.2

2 years ago

1.82.3

2 years ago

1.79.0

2 years ago

1.76.2

2 years ago

1.78.0

2 years ago

1.78.1

2 years ago

1.78.2

2 years ago

1.78.3

2 years ago

1.81.0

2 years ago

1.77.0

2 years ago

1.74.0

2 years ago

1.75.0

2 years ago

1.75.1

2 years ago

1.72.1

2 years ago

1.72.2

2 years ago

1.76.0

2 years ago

1.76.1

2 years ago

1.73.0

2 years ago

1.56.0

2 years ago

1.63.1

2 years ago

1.67.0

2 years ago

1.48.3

2 years ago

1.70.0

2 years ago

1.70.2

2 years ago

1.51.0

2 years ago

1.55.0

2 years ago

1.53.4

2 years ago

1.53.6

2 years ago

1.57.1

2 years ago

1.53.5

2 years ago

1.60.2

2 years ago

1.60.1

2 years ago

1.64.0

2 years ago

1.68.0

2 years ago

1.68.1

2 years ago

1.49.1

2 years ago

1.49.0

2 years ago

1.71.0

2 years ago

1.71.1

2 years ago

1.52.0

2 years ago

1.58.1

2 years ago

1.58.0

2 years ago

1.61.0

2 years ago

1.65.0

2 years ago

1.65.1

2 years ago

1.53.2

2 years ago

1.53.1

2 years ago

1.55.2

2 years ago

1.55.1

2 years ago

1.59.0

2 years ago

1.55.4

2 years ago

1.55.3

2 years ago

1.55.5

2 years ago

1.62.0

2 years ago

1.62.1

2 years ago

1.66.0

2 years ago

1.66.1

2 years ago

1.50.1

2 years ago

1.50.0

2 years ago

1.50.3

2 years ago

1.50.2

2 years ago

1.54.0

2 years ago

1.50.4

2 years ago

1.37.1

2 years ago

1.44.4

2 years ago

1.48.2

2 years ago

1.48.1

2 years ago

1.44.5

2 years ago

1.29.1

2 years ago

1.29.4

2 years ago

1.29.2

2 years ago

1.29.3

2 years ago

1.32.1

2 years ago

1.34.0

2 years ago

1.38.0

2 years ago

1.41.0

2 years ago

1.41.2

2 years ago

1.45.0

2 years ago

1.26.1

2 years ago

1.46.11

2 years ago

1.46.10

2 years ago

1.35.1

2 years ago

1.39.1

2 years ago

1.35.6

2 years ago

1.39.0

2 years ago

1.35.4

2 years ago

1.35.8

2 years ago

1.46.6

2 years ago

1.35.10

2 years ago

1.27.0

2 years ago

1.46.5

2 years ago

1.46.8

2 years ago

1.46.7

2 years ago

1.46.9

2 years ago

1.30.2

2 years ago

1.30.0

2 years ago

1.30.1

2 years ago

1.36.0

2 years ago

1.47.0

2 years ago

1.28.2

2 years ago

1.28.0

2 years ago

1.28.4

2 years ago

1.31.1

2 years ago

1.31.0

2 years ago

1.25.4

3 years ago

1.25.0

3 years ago

1.25.1

3 years ago

1.23.0

3 years ago

1.22.2

3 years ago

1.14.1

3 years ago

1.14.0

3 years ago

1.10.3

3 years ago

1.12.0

3 years ago

1.10.2

3 years ago

1.11.0

3 years ago

1.15.0

3 years ago

1.13.1

3 years ago

1.13.0

3 years ago

1.11.1

3 years ago

1.15.2

3 years ago

1.15.1

3 years ago

1.9.11

3 years ago

1.10.0

3 years ago

1.9.10

3 years ago

1.9.9

3 years ago

1.9.8

3 years ago

1.9.7

3 years ago

1.9.6

3 years ago

1.9.1

3 years ago

1.9.5

3 years ago

1.9.4

3 years ago

1.9.3

3 years ago

1.9.2

3 years ago

1.9.0

3 years ago

1.8.8

3 years ago

1.8.7

3 years ago

1.8.6

3 years ago

1.8.5

3 years ago

1.8.4

3 years ago

1.8.2

3 years ago

1.8.1

3 years ago

1.8.0

3 years ago

1.7.8

3 years ago

1.7.7

3 years ago

1.8.3

3 years ago

1.7.3

3 years ago

1.7.6

3 years ago

1.7.5

3 years ago

1.7.4

3 years ago

1.7.1

3 years ago

1.7.0

3 years ago

1.6.0

3 years ago

1.5.0

3 years ago

1.4.0

3 years ago

1.2.4

3 years ago

1.2.3

3 years ago

1.3.0

3 years ago

1.2.0

3 years ago

1.2.2

3 years ago

1.2.1

3 years ago

1.1.2

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.10

3 years ago

1.0.9

3 years ago

1.0.8

3 years ago

1.0.7

3 years ago

1.0.6

3 years ago

1.0.0

3 years ago