因为要浏览器端兼容 Node 语法, 异步加载是少不了的, 就想尝试添加异步加载
require "module", (the_module) -> console.log "do something"
按直观的想法改了下, 发现不起作用:
global.require = (package_name, callback) ->
result = module.require package_name
callback result if callback?
result
具体是全局的 require 和模块当中的 require 并不相同
因为 global.require 的确修改成功了, 但模块中单独用 require 却失败了
这么说 Node 在文件层面应该是有个作用域.. 这么问题有点棘手了
刚想到去找 Node 源码看看,, 没理出来入口...
https://github.com/joyent/node/blob/master/lib/module.js
哪位同学指点下?
回复 (3)
J
源码看到 require 被定义的地方, 原想从 module.__proto__ 修改函数的
结果实际上每次 require 被定义在 sandbox 的时候都是原来的函数
sandbox.require = require
https://github.com/joyent/node/blob/master/lib/module.js#L414
require 是每次执行时候重新被不生成一次的, 貌似改不到...
console.log module.__proto__
module.__proto__._require = module.__proto__.require
module.__proto__.require = (path , callback) ->
result = @_require path
console.log path, callback
if callback? then callback result
return result
console.log module.__proto__.require.toString()
require "jade", (jade) ->
console.log jade
console.log module.__proto__.require.toString()
J
引用 neuront具体没研究过, 不过 jinjs 支持把 html 文件当模块进行 require, 可以作为参考么?
没看懂...
他的代码像是直接修改对应模块里的 require 函数
看 Node 的实现方式, 应该是每个模块生成一次 require,,
那么这里的 require 找说只在模块文件内部起作用的..
这么就不懂了
参与回复
登录后即可参与回复。登录