在componentWillMount中,'require'是反模式吗?

时间:2018-02-05 13:10:10

标签: reactjs

componentWillMount中的'require'是反模式吗?我正在尝试根据当前用户区域动态加载区域设置。

componentWillMount(){
 if (localStorage.getItem('locale') === 'da') {
  require('moment/locale/da')
  moment.locale('da')
 }
}

谢谢!

2 个答案:

答案 0 :(得分:7)

根据捆绑您正在使用的代码的工具,结果可能会有所不同。如果您使用Webpack,它将就地解析“require”和“import”,而不是跳过类方法或任何东西。这意味着你不会从中受益。束尺寸不是最佳的,但你可能会增加脚射击的机会。

但是,在Webpack 3中,Webpack中有一个名为延迟加载的功能,允许您在运行时需要一个模块。 Webpack将负责在用户浏览器中的运行时放置所有必需的JS代码,以从服务器请求模块并执行它(想想创建一个“脚本”元素并将其附加到document)。

a note on lazy loading in official Webpack documentation指出了跨不同库实现此功能的潜在差异。有了这个,代码看起来像

async componentDidMount() { // <- note that componentWillMount isn't the best place to lazy-load a remote module, see @TryingToImprove's comment
  const da = await import('moment/locale/da'); // <- Webpack will add its magic here
  moment.locale(da);
}

另外,请阅读dynamic imports

所以,回答你的问题

  

在componentWillMount中,'require'是反模式吗?

我担心它仍然是在2018年初,至少以你描述的方式,除非特别注意它。

ESLint实际上有一个规则,global-require,当“import”或“require”语句位于除全局范围之外的任何位置时,它会自动挥动标志。

答案 1 :(得分:0)

如果您在运行时需要模块,则在捆绑时不会包含它们,并且它将是未定义的。