Javascript 如何创建在重新加载和代码推送过程中保持不变的变量?
如果我写一个插件,它需要一个非常大的初始化(14MB的JavaScript,需要1分钟来设置自己),我如何使这个对象在Meteor项目中使用的JavaScript文件中持久化(因为没有更好的词) 在插件初始化之后,我有一个对象Javascript 如何创建在重新加载和代码推送过程中保持不变的变量?,javascript,meteor,persistence,Javascript,Meteor,Persistence,如果我写一个插件,它需要一个非常大的初始化(14MB的JavaScript,需要1分钟来设置自己),我如何使这个对象在Meteor项目中使用的JavaScript文件中持久化(因为没有更好的词) 在插件初始化之后,我有一个对象LargeObject,当我添加一个文件simple_todo.js时,我想使用LargeObject,而不需要在每次更改后花费一分钟来加载它 我找不到任何解决办法 我尝试创建一个单独的包来存储这个包对象,但每次更改后都会清除并重新初始化 这样做的正确方式是什么?我想Met
LargeObject
,当我添加一个文件simple_todo.js时,我想使用LargeObject
,而不需要在每次更改后花费一分钟来加载它
我找不到任何解决办法
我尝试创建一个单独的包来存储这个包对象,但每次更改后都会清除并重新初始化
这样做的正确方式是什么?我想Meteor内部应该有某种东西能够在热代码推送中幸存下来。以下是两种可能的解决方案:
- 将其某些属性缓存在
会话中
- 将其某些属性缓存在简单集合中
- 在本地环境中使用存根
会话
只能在客户端使用。你可以在任何地方使用收藏
客户
在这里,不需要在客户端和服务器之间传输数据。对于每个连接的新客户机,都会重新运行代码
解放党
服务器
服务器
即使您可以在任何地方访问该收藏,您也不希望任何人能够对其进行更改。因为所有客户端共享同一个集合。集合缓存在客户端。阅读更多信息
树桩
存根可能是最容易实现的。但这是最糟糕的解决方案。您可能必须使用,但最终还是会在生产环境中拥有存根的代码
选择什么
这取决于您的确切用例。如果对象的内容依赖于客户端或用户,那么最好使用session-var。如果它不适用于集合。您可能需要构建一些缓存失效机制,但我想说,这是值得的。糟糕的措辞!您不需要静态的东西(这是一个OOP术语),而是跨多个代码更改的持久性东西。另外,请添加以下信息:由于数据生成(字符串、数字等字段)或必须生成方法,对象生成是否需要很长时间?如果生成数据只需要很长时间,您可以使用JSON;一个静态变量实际上就是我想要的。因此要选择这个词。这需要很长时间,因为它需要初始化很多东西(通过重写所有包含的库来支持这一点,可以对其进行优化,但这似乎有点疯狂)。它所做的事情之一是设置连接和交换数据(每次连接都会更改),而我无法控制这些数据。所以我真的无法优化这些部分。。。。什么?静态变量只是一个类变量,它与计算或生成无关。除非我大错特错,否则您想要的是避免在每次服务器重新加载时重复一些繁重的计算。这就是为什么我建议接受这个对象,对它进行JSON处理,并使用JSONed版本(即使它已经过时了)。x将包含我的初始化对象。作为独生子女;如果需要的话,我可以把它们放在一起。
example = function () {
if(!(this.aLotOfData = Session.get('aLotOfData'))) {
this.aLotOfData = computeALotOfData()
Session.set('aLotOfData', this.aLotOfData)
}
}
MuchDataCollection = new Mongo.Collection('MuchDataCollection')
Meteor.publish('MuchData', function (query) {
return MuchDataCollection.find(query)
})
example = function () {
if(
!this.aLotOfData = MuchDataCollection.findOne({
name: 'aLotOfData'
}).data
) {
this.aLotOfData = computeALotOfData()
MuchDataCollection.insert({
name: 'aLotOfData',
data: this.aLotOfData
})
}
}