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

gni*_*rus 5 reactjs

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

componentWillMount(){
 if (localStorage.getItem('locale') === 'da') {
  require('moment/locale/da')
  moment.locale('da')
 }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

ris*_*hat 7

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

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

在官方Webpack文档中有关于延迟加载的注释,指出了跨不同库实现此功能的潜在差异.有了这个,代码看起来就像

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);
}
Run Code Online (Sandbox Code Playgroud)

此外,阅读更多的动态进口.

所以,回答你的问题

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

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

ESLint实际上有一个规则,global-require,当"import"或"require"语句位于除全局范围之外的任何地方时自动挥动标志.