Nano Hash - криптовалюты, майнинг, программирование

React router 4 - маршрутизация + разделение кода, с webpack 1.9

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

  1. Связки:

Конфигурация webpack загружает файл js в качестве точки входа.

var entry = { appBundle : ["./src/index.js"] }

а в index.js мы делаем что-то вроде:

var mainRoutes = {
    component: "div",
    childRoutes: [
    {
       path: "/",
       component: require("./components/LandingPage.jsx"),
       childRoutes: [
            require("./components/dashboard"),
            ..
            ..
       ]
    }
}

а потом,

React.render(
   React.createElement(Router, { history: browserHistory, routes: mainRoutes }),
   document.getElementById("app-container")
 );

Я сохранил точку входа такой же, но изменил содержимое index.js на что-то вроде:

ReactDOM.render((
   <BrowserRouter>
     <LandingPage />
   </BrowserRouter>
 ), document.getElementById("app-container"));

а внутри LandingPage.jsx я определил все маршруты верхнего уровня следующим образом:

render() {
    return (     
      <main>
        <Switch>
          <Route path='/dashboard' component={Dashboard}/>
           ..
        </Switch>
      </main>
     );
  }

Маршрутизация работает нормально и все ок. Но разница, которую я вижу, заключается в том, что раньше webpack выдавал что-то вроде:

    Asset              Size                 Chunks           Chunk Names
                                            14 
    appBundle.js       xxx kB               0                appBundle
    dashboard.js       xxx kB               1                dashboard

.. and so on for most components

но сейчас это:

Asset              Size                 Chunks           Chunk Names
                                        1 
appBundle.js       xxx kB               0                appBundle

Итак, Q1: мне не хватает некоторых конфигураций для создания пакетов, как раньше?

  1. getComponents

В каждой папке нашего компонента у нас есть файл index.js с таким содержимым:

"use strict";

 module.exports = {
   path: "dashboard",

   getComponents(location, cb) {
     require.ensure([], (require) => {
       cb(null, require("./Dashboard.jsx"));
     }, "dashboard");
   }
 };

Я знаю, что getComponents больше не поддерживается в реактивном маршрутизаторе v4. Этот фрагмент кода загружал компонент асинхронно (и создавал ли разные пакеты?)?

Q2: Чем следует заменить файлы getComponents и index.js?

  1. Вложенные маршруты

React router 4 не поддерживает вложенные маршруты, и я должен добавлять компоненты везде, где мне нужны вложенные маршруты. Но я не знаю, где именно. Скажем, наши компоненты выглядят так:

"use strict";

 // import stuff
 class DashboardContainer extends React.Component {
   render() {
     return (
       <Dashboard {...this.props} />
     );
   }
 }

 class Dashboard extends React.Component {     
   render() {
     return (
       <div></div>
       <SomeOtherComponent/>
     );
   }
 }

 export default DashboardContainer;

Я изменил это на (со всем остальным кодом то же самое)

class Dashboard extends React.Component {     
       render() {
         return (
           <div>
               <div></div>
               <SomeOtherComponent/>
               <Route path='/childComponent' component={ChildComponent}/>
           </div>
         );
       }
     }

но дочерний компонент не отображается.

Q3: Где мне нужно определить маршрут дочернего / вложенного компонента?

Сообщите мне, если потребуется дополнительная информация. Спасибо.


  • Насколько велико ваше приложение? Вы рассматривали возможность создания нового приложения create-response-app вместо обновления старого? 23.09.2017
  • Он значительно большой, и даже если я начну новое приложение для реагирования, мне придется иметь дело с проблемами разделения кода и маршрутизации. 23.09.2017

Ответы:


1

A1: Это называется разделением кода. Я не слишком знаком с этим, но общая концепция заключается в разделении основных компонентов на отдельные пакеты, чтобы увеличить скорость загрузки вашего приложения. Эта статья хорошо объясняет, как который раньше работал со старыми версиями реактивного маршрутизатора.

Кроме того, в новом response-router-dom документы, в которых также обсуждается разделение кода в версии 4.

A2 / A3: Как вы упомянули, версия 4 действительно изменила способ отображения наших маршрутов. С появлением более динамических маршрутов и новых компонентов, таких как Switch, теперь мы должны выполнять всю нашу вложенную маршрутизацию в родительских компонентах каждого вложенного маршрута. Например, вы можете сделать следующее:

Main.js

ReactDOM.render((
  <BrowserRouter>
    <App/>
  </BrowserRouter>
), el)

Во-первых, мы объявляем компонент BrowserRouter для обработки истории браузера, чтобы синхронизировать пользовательский интерфейс.

App.js

const App = () => (
  <div>
    <Nav />

    <Switch>
      <Route exact path="/" component={Home}/>
      <Route path="/dashboard" component={Dashboard}/>
    </Switch>

    <Footer />
  </div>
)

Во-вторых, мы объявляем наш основной оператор switch в нашем контейнере приложения, который будет обрабатывать маршрутизацию всех родительских маршрутов.

Dashboard.js

const Dashboard = () => (
  <div>
    <h1>Welcome to the Dashboard!</h1>
    <Switch>
      <Router exact path="/dashboard component={MainView}/>
      <Route path="/dashboard/child-one" component={MainChildOne}/>
      <Route path="/dashboard/child-two" component={MainChildTwo}/>
    </Switch>
  </div>
)

Наконец, в нашем родительском маршруте мы объявляем еще один оператор switch, который будет обрабатывать все вложенные дочерние маршруты в нашем родительском маршруте.

Удачи!

21.09.2017
  • Спасибо за ответ о вложенных маршрутах. Я думаю, что мне не хватает инкапсуляции ‹Route› внутри ‹Switch› для вложенных компонентов. Я попробую. 23.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..