[
https://issues.apache.org/jira/browse/COUCHDB-1075?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13030010#comment-13030010
]
Caolan McMahon commented on COUCHDB-1075:
-----------------------------------------
I don't see the point in storing a function on the design doc if the results of
the function will never change. We may as well store the results of the
function. The only issue is detecting that a require path has found a module
and not an object. Using a function allows us to detect this because a design
doc is JSON and won't contain them, but the results of a module can be
anything, so we wouldn't know if the require path had worked or if we'd found a
pre-compiled module. Having a separate store for compiled modules avoids this
issue without having to constantly call a function which will always give the
same result.
Also, by caching the result and not the function you can be sure that
instanceof checks will work correctly. Consider the following, where 'a' is the
cached function for a module (instead of a module result):
> a = function () {return {b: function () { this.name = 'bee'; }}}
[Function]
> one = a();
{ b: [Function] }
> two = a();
{ b: [Function] }
> obj1 = new one.b()
{ name: 'bee' }
> obj2 = new two.b()
{ name: 'bee' }
> obj1 instanceof one.b
true
> obj1 instanceof two.b
false
> Circular require's in CommonJS modules
> --------------------------------------
>
> Key: COUCHDB-1075
> URL: https://issues.apache.org/jira/browse/COUCHDB-1075
> Project: CouchDB
> Issue Type: Bug
> Components: JavaScript View Server
> Reporter: Caolan McMahon
> Labels: javascript
> Attachments: module_cache.diff
>
>
> Having a CommonJS module A which requires B, when B also requires A causes
> the stack to fill up with require calls. A prerequisite for this fix is the
> caching of modules, even if it is only on a per-request basis.
> Patch incoming.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira