2 remote
Cheng Zhao редактировал(а) эту страницу 2013-06-01 23:45:32 -07:00

Synopsis

It's common that the developers want to use modules in browsers from the renderer, like closing current window, opening file dialogs, etc. Instead of writing IPC code for every operation you want to do, atom-shell provides the remote module to let you do RPC call just like using normal javascript objects.

An example of creating a window in renderer:

var remote = require('remote');
var BrowserWindow = remote.require('browser-window');
var win = new BrowserWindow({ width: 800, height: 600 });
win.loadUrl('https://github.com');

Lifetime of remote objects

Every object returned by remote module represents an object in browser (e.g. a remote object), so when you call methods of an object, or call a returned function, or even create a object with the returned constructor, you are indeed making a synchronous RPC call. And when the renderer releases the last reference to the remote object, the browser would release the corresponding reference too.

This also means that, if the renderer keeps a reference to an object in browser, the object would never be released. So be careful to never leak the remote objects.

Passing callbacks

Many APIs in browser accepts callbacks, so the remote module also supports passing callbacks when calling remote functions, and the callbacks passed would become remote functions in the browser.

But in order to avoid possible dead locks, the callbacks passed to browser would be called asynchronously in browser, so you should never expect the browser to get the return value of the passed callback.

Another thing is the lifetime of the remote callbacks in browser, it might be very tempting to do things like following:

var remote = require('remote');
remote.getCurrentWindow().on('close', function() {
  // blabla...
});

Yes it will work correctly, but when you reload the window, the callback you setup on the object in browser will not be erased, resources are leaked and there is no magic in javascript to release a referenced object.

So if you really need to keep a reference of callbacks in browser, you should write the callback in browser and send messages to renderer. And also make use of DOM's events like unload and beforeunload, they will work perfectly.

remote.require(module)

  • module String

Return a module in browser.

remote.getCurrentWindow()

Return the BrowserWindow object that represents current window.

Note: it doesn't return the window object which represents the global scope, instead it returns an instance of the BrowserWindow class which is created with browser-window module in browser.

remote.getGlobal(name)

  • name String

Return the global[name] value in browser.

remote.process

Getter to return the process object in browser, this is the same with remote.getGlobal('process') but gets cached.