首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Webpack 4中,我们是否可以使用import()令牌动态生成页面块,以便将react组件转换为可加载的页面块?

在Webpack 4中,我们是否可以使用import()令牌动态生成页面块,以便将react组件转换为可加载的页面块?
EN

Stack Overflow用户
提问于 2019-02-25 10:23:15
回答 1查看 155关注 0票数 7

我们使用react和反应可加载

在应用程序初始化期间,我们要验证我们定义的每个<Route />是否存在component.preload方法。

如果缺少该方法,我们将显示一个警告,显示组件应该是可加载的。

我们使用webpack 4,是否有一种自动包装组件的方法,所以我们不需要手动完成它?

以下是组件的样子:

代码语言:javascript
复制
/** MyComponent.js: page component */
export default () => <div>Hello world</div>;

这是包装在一个反应可加载组件中的同一个组件:

代码语言:javascript
复制
/**
 * preconfigured react-loadable 
 * See https://github.com/jamiebuilds/react-loadable#how-do-i-avoid-repetition)
 */
import MyLoadable from '@scopped/react-loadable';

/** loadable component */
export default MyLoadable({
  loader: () => import('./MyComponent'), /** import page component */
});
  1. 我们的<Route />是用node_modules声明的,并且是在不同的包中声明的。
  2. 它可以使用 (来自反应-管理)而不是<Route />声明。
  3. 它们不是以ESM格式分发的,而是仅以CJS (CommonJS)分发的。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-25 13:18:33

我不确定这是不是正确的方法,但也许您可以编写某种webpack加载程序,对文件进行预处理,在文件中找到<Route />模式,确定它们呈现的组件的路径,并使用这些信息将它们转换为可加载的组件。

这有点麻烦,但它应该可以工作(只适用于导入,但您可以根据需要对其进行调整):

Webpack配置:

代码语言:javascript
复制
{
  test: /\.js$/,
  exclude: /node_modules/,
  use: {
    loader: [
      "babel-loader", // Rest of your loaders
      path.resolve(__dirname, 'path/to/your/loader.js')
    ]
  }
}

loader.js:

代码语言:javascript
复制
module.exports = function (source) {
  const routeRegex = new RegExp(/<Route.*component={(.*)}.*\/>/g);
  let matches;
  let components = [];

  while (matches = routeRegex.exec(source)) {
    components.push(matches[1]); // Get all the component import names
  }

  // Replace all import lines by a MyLoadable lines
  components.forEach((component) => {
    const importRegex = new RegExp(`import ${component} from '(.*)'`);
    const path = importRegex.exec(source)[1];

    source = source.replace(importRegex, `
      const ${component} = MyLoadable({
        loader: () => import('${path}')
      });
    `);
  });

  source = `
    import MyLoadable from './MyLoadable';
    ${source}
  `;

  return source;
};

这绝对是无趣的,但如果你坚持惯例,这是可行的。它转换这种文件:

代码语言:javascript
复制
import Page1 from './Page1';
import Page2 from './Page2';

export default () => (
  <Switch>
    <Route path='/page1' component={Page1} />
    <Route path='/page2' component={Page2} />
  </Switch>
);

进入这个档案:

代码语言:javascript
复制
import MyLoadable from './MyLoadable;

const Page1 = MyLoadable({
  loader: () => import('./Page1')
});

const Page2 = MyLoadable({
  loader: () => import('./Page2')
});

export default () => (
  <Switch>
    <Route path='/page1' component={Page1} />
    <Route path='/page2' component={Page2} />
  </Switch>
);

这个例子有一些问题( MyLoadable的路径应该是绝对的,只有当页面组件被导入,可加载的组件不在单独的文件中,这可能导致重复,.)但你知道

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54864023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档