CNode

怎样修改 Node 默认的 require 函数?

Jjiyinyiyong发布于13 年前最后回复13 年前3 回复5717 浏览0 收藏

因为要浏览器端兼容 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
jiyinyiyong#1·13 年前

源码看到 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()
N
neuront#2·13 年前

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

J
jiyinyiyong#3·13 年前
引用 neuront具体没研究过, 不过 jinjs 支持把 html 文件当模块进行 require, 可以作为参考么?

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

参与回复
登录后即可参与回复。登录