Uncaught TypeError: require.ensure не является функцией в Object.getComponent (ECMASCRIPT) - PullRequest
0 голосов
/ 13 февраля 2020

Я портирую на свой метеоритный проект, чтобы использовать ecmascript вместо webpack / babel. Также улучшаю свой метеор (с 1.4 до 1.7) и реагирую (с 15.3.2 до 16.8.6) тоже.

rout.jsx

import * as React from 'react';

export default function (injectDeps, {Store, Routes}) {
  const route = {
    path: 'tickets',
    onEnter: (nextState, replace) => {
      if (!Meteor.userId() || !Roles.userIsInRole(Meteor.userId(), 'staff', Roles.GLOBAL_GROUP)) {
        replace('/login');
      }
    },
    getComponent(nextState, cb) {
      require.ensure([], (require) => {
        Store.injectReducer('tickets', require('./reducers'));
        cb(null, require('./containers/list.js'));
      }, 'tickets');
    },
    childRoutes: [
      {
        path: ':_id',
        getComponent(nextState, cb) {
          require.ensure([], (require) => {
            Store.injectReducer('tickets', require('./reducers'));
            cb(null, require('./containers/view.js'));
          }, 'tickets.view');
        }
      }
    ]
  };

  Routes.injectChildRoute(route);
}

Получил эту ошибку:

Uncaught TypeError: require.ensure is not a function
    at Object.getComponent (routes.jsx:20)
    at getComponentsForRoute (modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:38035)
    at modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:38053
    at modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:37842
    at Array.forEach (<anonymous>)
    at mapAsync (modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:37841)
    at getComponents (modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:38052)
    at finishEnterHooks (modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:37263)
    at next (modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:37810)
    at loopAsync (modules.js?hash=d04d5856a2fe2fa5c3dc6837e85d41adc321ecb2:37814

Любое предложение, как портировать это?

1 Ответ

0 голосов
/ 22 апреля 2020

Вот как это было сделано, чтобы избавиться от require.ensure:

rout.jsx (окончательный вариант)

{
    path: 'config',
    getComponent(nextState, cb) {
        import('./containers/config').then(mod => {
            Store.injectReducer('config', require('./reducers/config').default);
            cb(null, mod.default);
        });
    }
}

ПРИМЕЧАНИЕ: 1) Это как выполнить миграцию с require.ensure (используется веб-пакетом) без использования веб-пакета (в моем случае это был полный запуск Meteor Atmosphere) 2) mod и require(...).xxx были изменены на mod.default и require(...).default если reducer функция экспортируется как export default, в противном случае reducer вызываться не будет.

...