怎样修改 Node 默认的 require 函数?
发布于 2年前 作者 jiyinyiyong 816 次浏览

因为要浏览器端兼容 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 回复

源码看到 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()

具体没研究过, 不过 jinjs 支持把 html 文件当模块进行 require, 可以作为参考么?

没看懂… 他的代码像是直接修改对应模块里的 require 函数 看 Node 的实现方式, 应该是每个模块生成一次 require, 那么这里的 require 找说只在模块文件内部起作用的… 这么就不懂了

回到顶部