@mikor

Динамическая подгрузка js, css в REACT?

Имеем React, Webpack, React-Router

Ну и одна точка входа
import React from 'react'
import ReactDOM from 'react-dom'
import { Router, Route, Switch } from 'react-router'
import createHistory from 'history/createBrowserHistory'

// SHARED
import './shared/stylesheets/base.scss'

// APPS
import Welcome from './welcome'
import Authorization from './authorization'
import Registration from './registration'

const history = createHistory()
const div = document.createElement('div')
document.body.append(div)

ReactDOM.render(
  <Router history={history}>
    <Switch>
      <Route component={Welcome} exact={true} path="/" />
      <Route component={Authorization} exact={true} path="/sign_in" />
      <Route component={Registration} exact={true} path="/sign_up" />
    </Switch>
  </Router>,
  div
)

у меня генерируются 4 файла: index.html, main.css, main.js, manifest.js. Как вы можете видеть по маршрутам есть 3 страницу и хотелось бы что бы для каждой страницы грузился свой css/js файл + общие (vendors и manifest), а не один main содержащий в себе всю пачку стилей/скриптов.

Вопрос как? Или с одной точкой входа такое не провернуть?
  • Вопрос задан
  • 2483 просмотра
Решения вопроса 2
dummyman
@dummyman
диссидент-схизматик
А зачем это надо? Во первых, одним файлом загружать гораздо быстрее, чем десятками мизерных почти с одним и тем же пустым шаблоном кода.

Если делать индивидуально для каждой страницы - может быть пересекающийся код, который помимо трафика сожрет повторно еще и оперативки.

Например, то же сжатие gzip имеет смысл на файлах >8kb, в противном случае он может не только не сжимать код, но и немного увеличить. При этом один собранный общий файл js или css gzip легко может сжать и в 10 раз.

Собирать код в общие файлы также полезно и для сервера. Даже если они кэшируются браузером, браузер все равно отправляет запрос по каждому файлу web-серверу, который в свою очередь смотрит в папку с проектом и отвечает браузеру, что файл не изменился. А каждое обращение к HDD съедает его ресурс и увеличивает время переходов по сайту.

Мое мнение - если у вас меньше 20Мб яваскрипта и стилей - не стоит задумываться об их разделении. Большой головняк и при этом минимум эффективности.
Ответ написан
Eastman
@Eastman
Frontend's Zen
Насчет динамической подгрузки js-файлов, я дал вам ответ в этой теме.
Насчет же файлов стилей, тут можно по-разному и если я сейчас повторю то, что сказали выше, то прошу не быть очень строгим.
По себе скажу, что удобно когда в проекте есть папка styles, в которой содержится main.less (работаю с less просто), в котором подключен ваш reset.css, variables.less с переменными, etc. Файл main.less, в свою очередь, импортируется в вашей точке входа. В main.less содержаться очень общие стили проекта.
Что касательно компонентов и их стилей. Как принято, smart-компоненты не содержат стили, dumb - содержат, то есть у каждого dumb-компонента есть (если необходимо) свой одноименный файл с разрешением - *.less, *.scss, *.css (выбирайте по вкусу), который подключенный к этому компоненту.
Как описывать стили? Вот пару вариантов (для всех вариантов необходима соответствующая настройка конфигурации Webpack.):


Насчет стилей и Webpack. Как я понимаю, есть два варианта:
  • В Webpack вы используете ExtractTextPlugin - получаете один bundle.css, где находятся общие стили проекта и стили каждого компонента
  • В Webpack вы не используете ExtractTextPlugin:
    • Если у вас один bundle.js, то в нем вы получите все свои стили
    • Если вы используете динамическую подгрузку скриптов по роуту, то получите в каждом js-chunk'e и js,
      и css-код, то есть то же, что и выше, только разделено согласно роутам (попробовал только-что на своем проекте - работает)

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
вы можете рядом с каждым компонентом создать свой css и подключить import './yourcss.css'.
таким образом для каждого компонента можно отдельно писать свои стили.
Ответ написан
@vaskadogana
Frontend developer
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы