新手问题 JS 可以操作本地文件?

hungyuhei · 2012年06月09日 · 最后由 HungYuHei 回复于 2012年06月09日 · 7952 次阅读

今天装了 Pow,第一次打开时,它提示 Automatic RVM support is deprecated 然后有个链接 Add this code to .powrc for me ,点击后,就会自动在你的项目加上.powrc 这个文件

在页面源码找了一下相关的 JS,那个链接就是绑定 click 事件到 function addToPowrc 的,好奇怎样实现的,JS 可以操作本地文件?

function addToPowrc(link) {
  perform(link, "add_to_powrc",
    "This code has been added to your application&rsquo;s <code>.powrc</code> file."
  )
}

function perform(link, action, successHTML) {
  if (link.className == "busy") return
  link.className = "busy"

  xhr = new XMLHttpRequest()
  xhr.open("POST", "/__pow__/rvm_deprecation/" + action, true)
  xhr.onreadystatechange = function() {
    if (xhr.readyState != 4) return
    link.className = ""

    if (xhr.status == 200) {
      var p = link.parentNode
      var previousInnerHTML = p.previousInnerHTML
      p.previousInnerHTML = p.innerHTML
      p.innerHTML = successHTML || previousInnerHTML
    }
  }

  xhr.send()
}
共收到 7 条回复

客户端Javascript的上下文都是浏览器,主要是操作DOM,不过如果Javascript不运行在浏览器的上下文中,当然也可以操作文件。例如Node.js就扩展了很多IO操作。

看了一眼源码,真相是这样的:

点击之后发送请求到/pow下的URL,这时Pow的服务器开始偷偷地去写文件,实现在这里

https://github.com/37signals/pow/blob/master/src/http_server.coffee#L221 https://github.com/37signals/pow/blob/master/src/rack_application.coffee#L242

由于你已经设置了Rack Application的路径,所以Pow可以知道要向哪个地方写入配置文件。

@HungYuHei 我们平时说的js不能操作系统文件是基于运行在浏览器上的js,受到浏览器的权限限制。pow是基于nodejs的,可以把他认为是一个和ruby一样的脚本语言就容易理解了。

#4楼 @zhex 我觉得Host在Browser里的JavaScript能否往文件系统写文件大家基本都知道,楼主也应该知道。这里让人困惑的地方是Pow用了一个比较tricky的方式,在Browser中调JavaScript去通知Pow的daemon server去写文件,让人感觉就是在网页上点了个链接就往文件系统写文件了。

如果我们换一个前提,假设Pow不是Node.js写的,而是Ruby写,估计没有弄明白情况的人也会问和楼主一样的问题。

基于 nodejs 的。 我第一次用pow 的时候就很诧异,居然是nodejs 不是ruby。。

#5楼 @_kaichen 是啊,我开始时就是按你说的这种思维去想,现在知道 Pow 原来是用 NodeJS 写的,就明白了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册