【发布时间】:2017-07-27 13:46:25
【问题描述】:
所以我使用 react-router 以及 require.ensure 和 webpack 来分块我的路线。然而,这导致了很多样板:
const getTermsAndConditions = (nextState, cb) => {
require.ensure([], require => {
cb(null, require('../containers/TermsAndConditions/TermsAndConditions'))
}, 'terms')
}
const getThread = (nextState, cb) => {
require.ensure([], require => {
cb(null, require('../components/Thread/Thread'))
}, 'inbox')
}
const getPrivacyPolicy = (nextState, cb) => {
require.ensure([], require => {
cb(null, require('../containers/PrivacyPolicy/PrivacyPolicy'))
}, 'privacy-policy')
}
我连续大约有 25 个这样的声明,然后在实际的渲染函数中:
<Route path='privacy' getComponent={getPrivacyPolicy} />
...etc
我不介意对路由进行硬编码,因为它可以很好地了解应用程序的整体布局,但我想减少 getPrivacyPolicy 类型声明的样板文件。我该怎么做?
编辑:我接受了@Michael Jungo 的回复,但发现getComponentFactory 生成的函数内部仍然有var 名称,而不是硬编码的字符串。
例如:
const PrivacyPolicy = getComponentFactory('../containers/PrivacyPolicy/PrivacyPolicy', 'privacy-policy')
然后console.log(PrivacyPolicy) 返回:
PrivacyPolicy: function (nextState, cb) {
require.ensure([], function (require) {
return cb(null, require(path))
}, chunkName)
}
所以path 和chunkName 都没有被它们的实际字符串值替换...
【问题讨论】:
-
当然没有硬编码的字符串,闭包就是这样工作的! (您可以使用
eval解决此问题,但我认为您不希望这样做)。但是,由于您无论如何都没有声明任何明确的依赖关系,因此您应该能够调整您的require调用以避免警告。您可能想ask a separate question 对此。 -
@Bergi 我什至不知道该问什么,您介意解释一下我将如何调整
require电话吗?执行我的 webpack 构建后,看起来这些块甚至都没有生成,所以这不是一个微不足道的错误。 -
啊,我错过了 webpack 尝试解析这些东西以创建块的情况。我假设如果您使用 AMD 风格的
require(带有回调),该脚本至少是可执行的。我也觉得你使用require.ensure但没有指定任何依赖项很奇怪。 -
@Bergi 这些是组件,任何部门都被列为
imports ...
标签: javascript reactjs webpack ecmascript-6 react-router