Package Exports
- window
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (window) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
window
Exports a
jsdom
window object.
Exports a jsdom window object. This is useful for enabling browser modules to run in Node.js or testing browser modules in any Node.js test framework.
Install
npm install --save window
Or if you're just using for testing you'll probably want:
npm install --save-dev window
Usage
const Window = require('window');
const window = new Window();
const div = window.document.createElement('div');
// HTMLDivElement
div instanceof window.HTMLElement
// true
Because window
is just a normal JavaScript object it can be used more efficiently with object destructuring.
const { document } = new Window();
document.body.innerHTML = '<div class="foo">Hi!</div>';
document.body.querySelector('.foo').textContent;
// "Hi!"
Config
You can also pass a jsdom config object that will be passed along to the underlying jsdom instance.
const jsdomConfig = { userAgent: 'Custom UA' };
const window = new Window(jsdomConfig);
window.navigator.userAgent;
// "Custom UA"
Universal Testing Pattern
You can use a really simple pattern to enable your browser modules to run in Node.js. Just allow a window object to be passed in to your module and prepend any references to browser globals with win
. Set win
to the passed in window object if it exists, otherwise fallback to global window
.
function createTitle(text, win) {
win = win || window;
const title = win.document.createElement('h1');
title.innerHTML = text;
return title;
};
module.exports = createTitle;
Browser usage:
createTitle('Hi');
// <h1>Hi</h1>
Node.js usage:
const window = new Window();
createTitle('Hi', window);
// <h1>Hi</h1>
Obviously you don't need to follow this exact pattern, maybe you already have an options object and you only need document
not the entire window object:
function createTitle(text, opts = {}) {
const doc = opts.document || window.document;
const title = doc.createElement('h1');
...
You can see an example of this pattern in lukechilds/create-node
. Specifically src/create-node.js and test/unit.js.
What about dependencies?
Sometimes you may have dependencies that you can't pass a window object to. In that scenario you can alternatively use browser-env
which will simulate a global browser environment.
License
MIT © Luke Childs