Хобрук: Ваш путь к мастерству в программировании

реагировать, метеор, веб-пакет, es6. Как создать экран загрузки/заставки

Я использую сборку для реагирования, модулей es6 и метеора с веб-пакетом. Этим специалистам требуется некоторое время, чтобы загрузить все свои материалы, прежде чем что-то появится на странице. Как мне с этим стеком показывать прелоадер/заставку пока все это загружается?

мой файл веб-пакета:

var autoprefixer = require('autoprefixer');

module.exports = {
    entry: [
        'babel-polyfill',
        './entry'
    ],
    resolve: {
        extensions: ['', '.js', '.jsx', '.json','css','scss']
    },
    devtool: 'eval',
    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                loader: 'babel',
                exclude: /node_modules/,
                query: {
                    plugins:['transform-runtime'],
                    presets:['es2015','stage-0','react']
                }
            },
            {
                test: /\.scss$/,
                loader:  'style-loader!css-loader!sass-loader!postcss-loader'
            },
            {
                test: /\.(jpe?g|png|gif|svg)$/i,
                loaders: [
                    'url?limit=8192',
                    'img-loader'
                ]
            },
        ]
    },
    postcss: [ autoprefixer({ browsers: ['last 2 versions'] }) ]
};

Мой файл entry.js:

import '../store.js';
import './../lib/routes.jsx';

Мой файл route.jsx:

import React from 'react';
import {FlowRouter} from 'meteor/kadira:flow-router';
import {mount} from 'react-mounter';
import $ from 'jquery';
import store from '../store.js';
import {Provider} from 'react-redux';

import App from '../client/components/app/app.jsx';
import HomePage from '../client/components/pages/home/homePage.jsx';
import AboutPage from '../client/components/pages/about/aboutPage.jsx';
import BlogPage from '../client/components/pages/blog/blogPage.jsx';
import BlogPostPage from '../client/components/pages/blogPost/blogPostPage.jsx';

FlowRouter.route('/', {
    name:"home",
    action() {
        mount(App, {page: <Provider store={store}><HomePage /></Provider>});
    }
});
FlowRouter.route('/about', {
    name:"about",
    action() {
        mount(App, {page: <Provider store={store}><AboutPage /></Provider>});
    }
});
FlowRouter.route('/blog', {
    name:"blog",
    action() {
        mount(App, {page: <Provider store={store}><BlogPage /></Provider>});
    }
});
FlowRouter.route('/blog/:slug', {
    name:"blog post",
    action(params) {
        console.log(params);
        mount(App, {page: <Provider store={store}><BlogPostPage slug={params.slug} /></Provider>});
    }
});

// this is just a work around for a problem I am having with initial rout loading in development mode.
if (!$('.app-root').length)
    FlowRouter.go(window.location.href.replace(/^http(s)?\:\/\/[^:\/\#]*(\:[^\/\#]*)?\/?/,'/').replace(/\#.*$/,'')+'#'+Math.floor(Math.random()*100000));

let lastPage = FlowRouter.current();
store.subscribe(()=>{
    let state = store.getState();
    if (!state || state.currentURL != lastPage)
        FlowRouter.go(state.currentURL);
});

  • На самом деле я ничего не пробовал, все, что я продолжаю придумывать, - это ответы о том, как это сделать с помощью собственной методологии упаковки метеоров, а не когда задействован веб-пакет, который в значительной степени пересматривает все это. 11.05.2016
  • Я также не могу найти ничего полезного в настройках файлов конфигурации веб-пакета, которые я мог бы использовать для достижения этой цели. 11.05.2016
  • Я немного запутался... вы имеете в виду живую перезагрузку при разработке? Когда вы запускаете его в производство, он на самом деле ничего не создает. 11.05.2016
  • Меня на самом деле не волнует hmr, который в любом случае в значительной степени сломан в моем текущем стеке (кажется, он очень запутался при использовании подхода модулей es6 для моих реагирующих компонентов). При загрузке сайта в продакшн браузеру необходимо передать ряд ресурсов, чтобы метеоритный сайт работал, даже с помощью веб-пакетов это требует времени. Мне нужно найти способ показать экран загрузки (простой графический загрузчик или аналогичный), пока все это происходит. По сути, добавление исходного html-кода на страницу в начале процесса загрузки. Или что-то подобное для работы загрузчика. 11.05.2016
  • почему бы просто сначала не загрузить заставку, а затем использовать ReactDOM.render(), чтобы удалить содержимое узла и заменить его своим приложением? 11.05.2016
  • @corvid как этого добиться? Из того, что я вижу, полное «приложение» должно быть загружено до запуска любого из javascript. 11.05.2016
  • да, но он будет отображать HTML, и когда javascript будет готов, React вставит его содержимое в этот div и удалит заставку (теоретически) 11.05.2016
  • Пост @corvid дополнен некоторым кодом 11.05.2016
  • @corvid Итак, мой вопрос на данный момент заключается в том, как заставить веб-пакет отображать исходный HTML-файл, поскольку с моим присутствием веб-пакетов метеор, похоже, не загружает автоматически какие-либо HTML-файлы и шаблоны. 11.05.2016
  • Я нашел эти похожие вопросы полезными: .com/questions/35299620/ 04.03.2017

Ответы:


1

После тонны исследований и большой помощи из этой темы: https://github.com/webpack/webpack/issues/215

Я обнаружил, что нет надежного способа сделать это, по крайней мере, не то, что я имел в виду.

Решение, которое я использовал в конце, было в моем входном файле, чтобы использовать следующий код:

import $ from 'jquery';

$('body').addClass('css-loading-class-goes-here');

require.ensure(['../store.js', './../lib/routes.jsx'], function(require) {
    require(['../store.js','./../lib/routes.jsx']);
});

Вы можете добавить css, добавить контент или что-то еще, что вы хотите сделать в начале, но это будет выполняться только после загрузки большого количества «родного» javascript из веб-пакета и друзей (около 350 КБ в моем случае). Затем require.ensure принуждает веб-пакет загружать все javascript, специфичные для моего приложения, в отдельный пакет постфактум, поэтому мой «загрузчик» активен как минимум для половины процесса загрузки.

Это было единственное решение, которое я смог найти в конце.

12.05.2016
Новые материалы

Блоги, которые обязательно нужно прочитать специалистам по обработке и анализу данных :
Добро пожаловать в 2020! Новый год и новое десятилетие. Поскольку мы начинаем новый и захватывающий год в науке о данных, важно, чтобы профессионалы открыли для себя лучшие блоги по науке о..

Универсальный базовый доход
Универсальный базовый доход В последние годы концепция всеобщего базового дохода (УБД) набирает обороты как все более эффективное решение для борьбы с растущим неравенством доходов и..

Освоение Python для анализа финансовых данных: руководство по получению данных о доходах от акций
Если вы хотите научиться получать данные о доходах от акций с помощью Python, то это руководство для вас! В этой статье мы рассмотрим несколько примеров сбора данных о доходах от акций. Мы..

Абсолютно имеет смысл.
Абсолютно имеет смысл. Мой репетитор даже предложил то же самое. Одна проблема, с которой я столкнулся, заключается в том, что для каждой из категорий не было ярлыка «хорошо». Если я перебираю..

МАШИННОЕ ОБУЧЕНИЕ И EDA
Каковы шаги в машинном обучении Определение проблемы Генерация гипотез Извлечение данных Исследование данных Прогнозное моделирование Развертывание модели Зачем нам ЭДА? Идентификация..

В чем основные различия между ReactJS и React-Native?
В чем основные различия между ReactJS и React-Native? Что я узнал, создавая веб-приложения, а затем мобильные приложения на React React-Native существует уже около 2 лет и стал..

LeetCode — Умножение строк
Постановка задачи Даны два неотрицательных целых числа num1 и num2 , представленные в виде строк, вернуть произведение num1 и num2 , а также представлен в виде строки. Примечание . Вы..