escplat12
escplat12

Reputation: 2521

Using import fs from 'fs'

I want to use import fs from 'fs' in JavaScript. Here is a sample:

import fs from 'fs'

var output = fs.readFileSync('someData.txt')

console.log(output)

The error I get when I run my file using node main.js is:

(function (exports, require, module, __filename, __dirname) { import fs from 'fs
'
                                                              ^^^^^^
SyntaxError: Unexpected token import

What should I install in Node.js in order to achieve importing modules and functions from other places?

Upvotes: 181

Views: 475065

Answers (11)

Ali Khosro
Ali Khosro

Reputation: 1830

It is 2023, In the current version node 16+:

import {readFileSync} from "fs"

const string_output = readFileSync("path-to-file", 'utf8')
// the rest

If you do not give the second argument, encoding 'utf8', it will return a binary file

Upvotes: 10

Simba
Simba

Reputation: 45

If you want your statement import fs from 'fs' to be executable, you can make your file extension .mjs instead of .js. i.e filename.mjs

Upvotes: 1

Usama ijaz
Usama ijaz

Reputation: 19

hey friends node js use commonjs not modaljs so use alawys use const fs = require('fs') for file system if we use modaljs import fs from 'fs' its give error se in termile import {fs} from 'fs'; ^^^^^^ SyntaxError: Cannot use import statement outside a module

Upvotes: -2

Anurag Maheshwari
Anurag Maheshwari

Reputation: 167

Go to package.json file and add:

"type": "module"

This worked for me!

Upvotes: 11

Rajkumar Peter
Rajkumar Peter

Reputation: 939

If we are using TypeScript, we can update the type definition file by running the command npm install @types/node from the terminal or command prompt.

Upvotes: 3

Yoann
Yoann

Reputation: 741

Building on RobertoNovelo's answer:

import * as fs from 'fs';

is currently the simplest way to do it.

It was tested with a Node.js project (Node.js v10.15.3), with esm, allowing to use import.

Upvotes: 59

José Silva
José Silva

Reputation: 401

The new ECMAScript module support is able natively in Node.js 12 🎉

It was released on 2019-04-23 and it means there is no need to use the flag --experimental-modules.

To read more about it:

The new ECMAScript module support in Node.js 12

Upvotes: 0

nomis
nomis

Reputation: 1574

In order to use import { readFileSync } from 'fs', you have to:

  1. Be using Node.js 10 or later
  2. Use the --experimental-modules flag (in Node.js 10), e.g. node --experimental-modules server.mjs (see #3 for explanation of .mjs)
  3. Rename the file extension of your file with the import statements, to .mjs, .js will not work, e.g. server.mjs

The other answers hit on 1 and 2, but 3 is also necessary. Also, note that this feature is considered extremely experimental at this point (1/10 stability) and not recommended for production, but I will still probably use it.

Here's the Node.js 10 ESM documentation.

Upvotes: 43

SakoBu
SakoBu

Reputation: 4011

It's not supported just yet... If you want to use it you will have to install Babel.

Upvotes: -1

RobertoNovelo
RobertoNovelo

Reputation: 3819

For default exports you should use:

import * as fs from 'fs';

Or in case the module has named exports:

import {fs} from 'fs';

Example:

//module1.js

export function function1() {
  console.log('f1')
}

export function function2() {
  console.log('f2')
}

export default function1;

And then:

import defaultExport, { function1, function2 } from './module1'

defaultExport();  // This calls function1
function1();
function2();

Additionally, you should use Webpack or something similar to be able to use ES6 import

Upvotes: 224

phihag
phihag

Reputation: 288140

ES6 modules support in Node.js is fairly recent; even in the bleeding-edge versions, it is still experimental. With Node.js 10, you can start Node.js with the --experimental-modules flag, and it will likely work.

To import on older Node.js versions - or standard Node.js 10 - use CommonJS syntax:

const fs = require('fs');

Upvotes: 75

Related Questions