Size: a a a

Webpack — русскоговорящее сообщество

2020 July 21

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
источник

A

Alex CherryTea in Webpack — русскоговорящее сообщество
👍
источник

y

ymdev in Webpack — русскоговорящее сообщество
Bogdan Aleksandrovich
короче без нодемона делают, не могу найти ничего абсолютно, все , что нахожу - там нодемон, да даже сборки сервера нет, разве не должен сделать сборку клиента, собрать сервер и положить рядом
не знаю на счет ноддемона, что ты там хотел, но касательно ssr и react.
Условно, тебе нужно 2 клиента:
1) с hydrate, который будет подключен в браузере через скрипт
2) для сервера, в котором будет StaticRouter и прочее

Вот для клиента конфиг https://pastebin.com/GDQ1JMV6
И условно точно входа для этого конфига
import React from 'react'
import { hydrate } from 'react-dom'
import { loadableReady } from '@loadable/component'
import App from './App'

loadableReady(() => {
   hydrate(
       <App />,
       document.getElementById('root')
   )
})


Вот для сервера конфиг (из-за jsx приходится весь сервер собирать) https://pastebin.com/b9cug8Ur
И точка входа для серверной сборки клиента
import React from 'react'
import { renderToString } from 'react-dom/server'
import { ChunkExtractor } from '@loadable/server'
import { IStore } from '../../../client/src/types/store'

import ReduxProvider  from '../../../client/components/ReduxProvider'
import RouterProvider from '../../../client/components/RouterProvider'
import App            from '../../../client/components/App'

import store from '../../../client/store'

interface IRenderApp {
   html:    string
   store:   IStore
   scripts: string
   links:   string
   styles:  string
}

export default function renderApp(url: string, context: object = {}): IRenderApp {
   const statsFile = '../../../dist/client/loadable-stats.json'
   const extractor = new ChunkExtractor({
       statsFile,
       entrypoints: [ 'app' ]
   })
   const jsx = extractor.collectChunks(
       <ReduxProvider>
           <RouterProvider
               location={ url }
               context={ context }
           >
               <App />
           </RouterProvider>
       </ReduxProvider>
   )
   const html  = renderToString(jsx)
   const redux = store.getState()
   const scripts = extractor.getScriptTags()
   const links   = extractor.getLinkTags()
   const styles  = extractor.getStyleTags()

   return {
       html,
       store: redux,
       scripts,
       links,
       styles
   }
}
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
ymdev
не знаю на счет ноддемона, что ты там хотел, но касательно ssr и react.
Условно, тебе нужно 2 клиента:
1) с hydrate, который будет подключен в браузере через скрипт
2) для сервера, в котором будет StaticRouter и прочее

Вот для клиента конфиг https://pastebin.com/GDQ1JMV6
И условно точно входа для этого конфига
import React from 'react'
import { hydrate } from 'react-dom'
import { loadableReady } from '@loadable/component'
import App from './App'

loadableReady(() => {
   hydrate(
       <App />,
       document.getElementById('root')
   )
})


Вот для сервера конфиг (из-за jsx приходится весь сервер собирать) https://pastebin.com/b9cug8Ur
И точка входа для серверной сборки клиента
import React from 'react'
import { renderToString } from 'react-dom/server'
import { ChunkExtractor } from '@loadable/server'
import { IStore } from '../../../client/src/types/store'

import ReduxProvider  from '../../../client/components/ReduxProvider'
import RouterProvider from '../../../client/components/RouterProvider'
import App            from '../../../client/components/App'

import store from '../../../client/store'

interface IRenderApp {
   html:    string
   store:   IStore
   scripts: string
   links:   string
   styles:  string
}

export default function renderApp(url: string, context: object = {}): IRenderApp {
   const statsFile = '../../../dist/client/loadable-stats.json'
   const extractor = new ChunkExtractor({
       statsFile,
       entrypoints: [ 'app' ]
   })
   const jsx = extractor.collectChunks(
       <ReduxProvider>
           <RouterProvider
               location={ url }
               context={ context }
           >
               <App />
           </RouterProvider>
       </ReduxProvider>
   )
   const html  = renderToString(jsx)
   const redux = store.getState()
   const scripts = extractor.getScriptTags()
   const links   = extractor.getLinkTags()
   const styles  = extractor.getStyleTags()

   return {
       html,
       store: redux,
       scripts,
       links,
       styles
   }
}
спасибо
источник

y

ymdev in Webpack — русскоговорящее сообщество
Само собой, я вырезал многое и не хватает кучи файлов, но смысл, думаю, будет понятен
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
ymdev
не знаю на счет ноддемона, что ты там хотел, но касательно ssr и react.
Условно, тебе нужно 2 клиента:
1) с hydrate, который будет подключен в браузере через скрипт
2) для сервера, в котором будет StaticRouter и прочее

Вот для клиента конфиг https://pastebin.com/GDQ1JMV6
И условно точно входа для этого конфига
import React from 'react'
import { hydrate } from 'react-dom'
import { loadableReady } from '@loadable/component'
import App from './App'

loadableReady(() => {
   hydrate(
       <App />,
       document.getElementById('root')
   )
})


Вот для сервера конфиг (из-за jsx приходится весь сервер собирать) https://pastebin.com/b9cug8Ur
И точка входа для серверной сборки клиента
import React from 'react'
import { renderToString } from 'react-dom/server'
import { ChunkExtractor } from '@loadable/server'
import { IStore } from '../../../client/src/types/store'

import ReduxProvider  from '../../../client/components/ReduxProvider'
import RouterProvider from '../../../client/components/RouterProvider'
import App            from '../../../client/components/App'

import store from '../../../client/store'

interface IRenderApp {
   html:    string
   store:   IStore
   scripts: string
   links:   string
   styles:  string
}

export default function renderApp(url: string, context: object = {}): IRenderApp {
   const statsFile = '../../../dist/client/loadable-stats.json'
   const extractor = new ChunkExtractor({
       statsFile,
       entrypoints: [ 'app' ]
   })
   const jsx = extractor.collectChunks(
       <ReduxProvider>
           <RouterProvider
               location={ url }
               context={ context }
           >
               <App />
           </RouterProvider>
       </ReduxProvider>
   )
   const html  = renderToString(jsx)
   const redux = store.getState()
   const scripts = extractor.getScriptTags()
   const links   = extractor.getLinkTags()
   const styles  = extractor.getStyleTags()

   return {
       html,
       store: redux,
       scripts,
       links,
       styles
   }
}
а кто отвечает за то, что ты можешь импортировать на сервере из клиента?
источник

y

ymdev in Webpack — русскоговорящее сообщество
Bogdan Aleksandrovich
а кто отвечает за то, что ты можешь импортировать на сервере из клиента?
не очень понял вопроса
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
я вот делаю конфиг и не могу имортировать на сервере из клиента
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
ymdev
не знаю на счет ноддемона, что ты там хотел, но касательно ssr и react.
Условно, тебе нужно 2 клиента:
1) с hydrate, который будет подключен в браузере через скрипт
2) для сервера, в котором будет StaticRouter и прочее

Вот для клиента конфиг https://pastebin.com/GDQ1JMV6
И условно точно входа для этого конфига
import React from 'react'
import { hydrate } from 'react-dom'
import { loadableReady } from '@loadable/component'
import App from './App'

loadableReady(() => {
   hydrate(
       <App />,
       document.getElementById('root')
   )
})


Вот для сервера конфиг (из-за jsx приходится весь сервер собирать) https://pastebin.com/b9cug8Ur
И точка входа для серверной сборки клиента
import React from 'react'
import { renderToString } from 'react-dom/server'
import { ChunkExtractor } from '@loadable/server'
import { IStore } from '../../../client/src/types/store'

import ReduxProvider  from '../../../client/components/ReduxProvider'
import RouterProvider from '../../../client/components/RouterProvider'
import App            from '../../../client/components/App'

import store from '../../../client/store'

interface IRenderApp {
   html:    string
   store:   IStore
   scripts: string
   links:   string
   styles:  string
}

export default function renderApp(url: string, context: object = {}): IRenderApp {
   const statsFile = '../../../dist/client/loadable-stats.json'
   const extractor = new ChunkExtractor({
       statsFile,
       entrypoints: [ 'app' ]
   })
   const jsx = extractor.collectChunks(
       <ReduxProvider>
           <RouterProvider
               location={ url }
               context={ context }
           >
               <App />
           </RouterProvider>
       </ReduxProvider>
   )
   const html  = renderToString(jsx)
   const redux = store.getState()
   const scripts = extractor.getScriptTags()
   const links   = extractor.getLinkTags()
   const styles  = extractor.getStyleTags()

   return {
       html,
       store: redux,
       scripts,
       links,
       styles
   }
}
вот как тут

import App from './App'
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
ты можешь, потому что точка входа стоит src/index , а не src/client/index ?
источник

y

ymdev in Webpack — русскоговорящее сообщество
У меня один репозиторий, в котором код для сервера и клиента рядом друг с другом.
Я из сервера обращаюсь к исходникам клиента
источник

y

ymdev in Webpack — русскоговорящее сообщество
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
у меня тоже, но при импорте из клиента на сервере, пишет, что нет модуля
источник

y

ymdev in Webpack — русскоговорящее сообщество
А потом это все собираю через webpack.
И в итоге я имею
/dist/server - для сервера
/dist/client - для браузера

А потом сервер запускаю из /dist/server
Как можно догадаться, после сборки на сервере чистый js на commonjs-модулях
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
вроде что то понял, буду пробовать
источник

y

ymdev in Webpack — русскоговорящее сообщество
Ну то есть я пишу import везде. А после сборки там будет require
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
у меня ошибка видимо была из-за этого

 entry: path.resolve(__dirname, "../src/server/index.jsx"),
источник

BA

Bogdan Aleksandrovic... in Webpack — русскоговорящее сообщество
Bogdan Aleksandrovich
у меня ошибка видимо была из-за этого

 entry: path.resolve(__dirname, "../src/server/index.jsx"),
и он не видит модули выше
источник

A

Alex CherryTea in Webpack — русскоговорящее сообщество
ymdev
не знаю на счет ноддемона, что ты там хотел, но касательно ssr и react.
Условно, тебе нужно 2 клиента:
1) с hydrate, который будет подключен в браузере через скрипт
2) для сервера, в котором будет StaticRouter и прочее

Вот для клиента конфиг https://pastebin.com/GDQ1JMV6
И условно точно входа для этого конфига
import React from 'react'
import { hydrate } from 'react-dom'
import { loadableReady } from '@loadable/component'
import App from './App'

loadableReady(() => {
   hydrate(
       <App />,
       document.getElementById('root')
   )
})


Вот для сервера конфиг (из-за jsx приходится весь сервер собирать) https://pastebin.com/b9cug8Ur
И точка входа для серверной сборки клиента
import React from 'react'
import { renderToString } from 'react-dom/server'
import { ChunkExtractor } from '@loadable/server'
import { IStore } from '../../../client/src/types/store'

import ReduxProvider  from '../../../client/components/ReduxProvider'
import RouterProvider from '../../../client/components/RouterProvider'
import App            from '../../../client/components/App'

import store from '../../../client/store'

interface IRenderApp {
   html:    string
   store:   IStore
   scripts: string
   links:   string
   styles:  string
}

export default function renderApp(url: string, context: object = {}): IRenderApp {
   const statsFile = '../../../dist/client/loadable-stats.json'
   const extractor = new ChunkExtractor({
       statsFile,
       entrypoints: [ 'app' ]
   })
   const jsx = extractor.collectChunks(
       <ReduxProvider>
           <RouterProvider
               location={ url }
               context={ context }
           >
               <App />
           </RouterProvider>
       </ReduxProvider>
   )
   const html  = renderToString(jsx)
   const redux = store.getState()
   const scripts = extractor.getScriptTags()
   const links   = extractor.getLinkTags()
   const styles  = extractor.getStyleTags()

   return {
       html,
       store: redux,
       scripts,
       links,
       styles
   }
}
> из-за jsx приходится весь сервер собирать
а если jsx писать только в jsx файлах?
источник

y

ymdev in Webpack — русскоговорящее сообщество
Alex CherryTea
> из-за jsx приходится весь сервер собирать
а если jsx писать только в jsx файлах?
Там ts + jsx + фичи, поддерживаемые бабелем и декораторы. Поэтому сунуть это все под один сборщик - нормальная идея
источник