将数据从 html 引导到 webpack 捆绑的 javascript

Posted

技术标签:

【中文标题】将数据从 html 引导到 webpack 捆绑的 javascript【英文标题】:Bootstrapping data into webpack bundled javascript from html 【发布时间】:2018-05-03 21:25:07 【问题描述】:

我最近将 React 应用程序从 globals-everywhere script-tag-per-js-file 设置转换为捆绑的 webpack 应用程序(太棒了!)。

但是,在最初的应用程序中,我能够在脚本中公开全局初始化函数,然后在我的 Scala Play 后端生成的 html 服务器中渲染调用。比如

// Component.js
class MyComponent extends React.Component 
    render() 
        <div> this.props.myData </div>
    

initComponent(data) 
    ReactDOM.render(
        <MyComponent myData=data />
    ) 

然后在后端:

// ComponentPage.scala.html
...
<script> 
  $(() => initComponent(@scala.serverVariable.getData(currentUser))
</script>

现在我的 javascript 已捆绑(并最终缩小/丑化),我无法让 scala 后端知道要调用的函数的损坏/最终名称。有没有办法告诉 webpack 将某些功能保持在全局范围内?是否有更好的模式可用于将服务器端数据引导到反应组件中?

这是我考虑过的两种方法:

我可以使它成为一个加载/完整样式组件,其中有一个微调器,然后是一个对服务器的 ajax 调用以获取正确的数据,但由于我在渲染时已经有可用的数据,我宁愿不承担从客户端到服务器的额外往返。 我可以将数据包含在带有数据属性的标签中,并在DocumentReady 上获取它,但是序列化/反序列化对复杂对象有限制,这感觉很hacky。

【问题讨论】:

【参考方案1】:

只需将函数附加到window 对象。这将防止名称修改。

window.initComponent = function(data) 
  ReactDOM.render(
    <MyComponent myData=data />
  ) 

类似(为了明确起见):

// ComponentPage.scala.html
...
<script> 
  $(() => window.initComponent(@scala.serverVariable.getData(currentUser))
</script>

【讨论】:

以上是关于将数据从 html 引导到 webpack 捆绑的 javascript的主要内容,如果未能解决你的问题,请参考以下文章

从 HTML 文件访问捆绑的 javascript(使用 webpack)中的函数

如何使用 Webpack 将供应商 CSS 文件捆绑到 React 应用程序中?

webpack加载AMD模块而不捆绑

Angular Cli Webpack,如何添加或捆绑外部 js 文件?

如何将 NewRelic 集成到与 Webpack 捆绑的 Node Typescript Express 服务器中?

公开通过 webpack 捆绑的 javascript 全局变量