是否可以在 PouchDB 地图功能中使用 lodash?
Is it possible to use lodash in PouchDB map function?
我想在 PouchDB 和地图函数中创建一个设计文档以利用 lodash
和 moment
。理想情况下,我想通过以下假设示例获得类似的结果;
import {get} from 'lodash';
import moment from 'moment';
const mapFn = (doc, emit) => {
emit([
get(doc, 'context.location'),
moment(get(doc, 'context.start')).format('DD-MMM-YYYY')
], get(doc, 'payments.total'));
};
db.put({
_id: `_design/myIndex`,
views: {
myIndex: {
map: mapFn.toString()
}
}
})
由于toString()
,范围无效。有没有办法注入这些库?
似乎答案很简单,当您使用网络工作者时,将 lodash
和 moment
公开给 window
或 self
。然后当 pouchDB eval
s 函数时,引用被解析。
您提出的解决方案可能有效,但不是最干净的解决方案(它依赖于全局变量并且仅在您的应用程序存在时有效,但如果您尝试复制数据并在其他地方使用视图,它就会中断) .
有一个更好的解决方案也适用于复制,例如使用 CouchDB:在您的视图中使用 CommonJS require()
。 See the CouchDB docs for more info. There is also an example for using CommonJS 在文档中。
只需使用 views.lib.lodash = lodash.toString();
对其进行字符串化,然后您就可以在视图函数中将其用作 require:
mapFn = (doc, emit) => {
var _ = require('views/lib/lodash');
var moment = require('views/lib/moment');
emit([
_.get(doc, 'context.location'),
moment(_.get(doc, 'context.start')).format('DD-MMM-YYYY')
], _.get(doc, 'payments.total'));
};
请注意,无论何时更新 lodash,您的视图都会失效(理论上,新的 lodash 版本可能会产生不同的视图结果)。你也不能只从 lodash 中对 get
进行字符串化,因为你会失去上下文。你可以 npm install lodash.get
并使用它,这应该是独立的。并始终使用浏览器的独立版本,因为库中的 require()s
由于路径不同而无法工作。
但在你的情况下,我宁愿使用一个简单的辅助函数而不是需要一个更大的库,这是一个太多的权衡。