1.37.0 • Published 4 years ago

enable-browser-mode v1.37.0

Weekly downloads
78
License
MIT
Repository
github
Last release
4 years ago

Enable browser mode

The goal of this package is to work as a quick-and-dirty one-liner that will allow a Node process to imitate a browser, letting you import traditional browser JS by setting the global object to window and binding relevant native prototype methods like window.Event.

/* [CommonJS] */
require('enable-browser-mode');

- or -

/* [ES6] */
import 'enable-browser-mode'

No variable assignment required, just call it! You can then require browser JS with:

/* Node */
include('./jquery.min.js');

- or -

/* [CLI] */
$ enable-browser-mode test/jquery.js test/jquery2.js

Which will evaluate that script in the global context. Make sure the scripts supplied to window.include() are trusted.

Example

Won't work:

console.log(document.createElement('a'));

// ReferenceError: document is not defined

Works like a charm:

require('enable-browser-mode');
console.log(document.createElement('a'));

// HTMLAnchorElement {Symbol(impl): HTMLAnchorElementImpl}

Use cases

By importing this package (which depends on JSDOM), we can expose the necessary globals and bind window as the global object, meaning we can write all of our browser-optimized (and DOM-dependent) code in a file like browser.js and reuse that same code in Node with include('browser.js') or window.include('browser.js').

The specific need for this functionality came from the web-widgets package, which generates widget trees using DOM operations like document.createElement(). The Node runtime cannot build out this widget tree by default, as it does not have access to the window and document variables, resulting in a ReferenceError.

For server-side rendering in Node, web-widgets builds out the widget tree on the virtual DOM and then exports it as flat HTML using the HTMLElement.outerHTML property; in the browser, the DOM is manipulated directly on-the-fly (i.e. with HTMLElement.appendChild). By simulating the browser global, we can use the exact same core library for both cases, the difference being just Widget.render(HTMLElement) to render into a DOM element and Widget.export() to dump the outerHTML.

Using enable-browser-mode, all that is needed to reuse original browser libraries (including jQuery, HammerJS, etc.) is creating an separate JS file for your Node logic, importing this package, and then importing your browser code with include:

require('enable-browser-mode');

window.include('browser.js');
myBrowserObject.doBrowserStuff(); 

// code like you're in the browser =)

Unsafe Mode

By default, JSDOM is called with runScripts: 'outside-only'. If you need to execute external JS (and not just add a <script> element to the DOM), set global.UNSAFE_MODE before your require('enable-browser-mode') call.

1.36.0

4 years ago

1.37.0

4 years ago

1.35.0

4 years ago

1.34.0

4 years ago

1.32.0

4 years ago

1.33.0

4 years ago

1.30.0

4 years ago

1.31.0

4 years ago

1.26.0

4 years ago

1.29.0

4 years ago

1.27.0

4 years ago

1.28.0

4 years ago

1.24.0

4 years ago

1.23.0

4 years ago

1.21.0

4 years ago

1.19.0

4 years ago

1.20.0

4 years ago

1.12.0

4 years ago

1.11.0

4 years ago

1.10.0

4 years ago

1.8.0

4 years ago

1.6.0

4 years ago

1.5.0

4 years ago

1.2.0

4 years ago

1.4.0

4 years ago

1.3.0

4 years ago

1.1.0

4 years ago