Import vs require in NodeJS and the Browser. We’ve all been there…
The Problem
You want to write a multi file JavaScript project that works both in NodeJS and the browser without needing a build step.
You tried using require and your browser slapped you in the face:
Then you tried import. You wrote two simple files:
businessLogic.js
export function businessLogic() {
console.log('Woa! This is some complex business logic');
}main.js
import { businessLogic } from './business-logic.js';
businessLogic();You ran it in NodeJS and BAM! You get another slap with the errors:
$ npm start
SyntaxError: Unexpected token importor
$ npm start
SyntaxError: Cannot use import statement outside a moduleThe Solution
Edit your package.json to use the --experimental-modules flag and "type": "module':
package.json
{
"type": "module", "name": "import-nodejs",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "node \"--experimental-modules\" main.js" },
"keywords": [],
"author": "",
"license": "ISC"
}Now, Node will not slap you anymore :
$ npm start
Woa! This is some complex business logicFor the browser, just add type="module" in your script tag:
index.html
<script type="module" src="./main.js"></script>And no more slapping by the browser either:
Notes
- As of NodeJS 13 you don’t need the
--experimental-modulesflag anymore. - Consider using Babel and Webpack if you are worried about browser support.
The demo code is available on github.