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

hungyuhei · June 09, 2012 · Last by HungYuHei replied at June 09, 2012 · 9280 hits

今天装了 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()
}

客户端 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 写的,就明白了

You need to Sign in before reply, if you don't have an account, please Sign up first.