Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SyntaxError: Cannot use import statement outside a module #922

Closed
d1y opened this issue Dec 3, 2019 · 44 comments
Closed

SyntaxError: Cannot use import statement outside a module #922

d1y opened this issue Dec 3, 2019 · 44 comments
Labels

Comments

@d1y
Copy link

d1y commented Dec 3, 2019

I use nextjs

import koa from 'koa'
import next from 'next'
import clear from 'clear'
import body from 'koa-bodyparser'
import cors from 'koa-cors'
import logger from 'koa-logger'
import Api from './router'
const dev = process.env.NODE_ENV !== 'production'
const App = next({ dev })
const handle = App.getRequestHandler()
const PORT = parseInt(process.env.NODE_PORT) || 3000

App.prepare().then(() => {
  const Server = new koa()

  Server.use(body())
  Server.use(cors())
  Server.use(logger())

  Server
    .use(Api.routes())
    .use(Api.allowedMethods())

  Server.use(async ctx=> {
    // https://thecodebarbarian.com/building-a-nextjs-app-with-mongodb
    await handle(ctx.req, ctx.res)
    ctx.respond = false
  })

  Server.listen(PORT, () => {
    clear()
    const cowsay = require('cowsay-browser')
    const text = `Koa server listen in ${ PORT }`
    console.log(cowsay.say({ text }))
  })

})

use ts-node server.ts, BTW

next git:(dev) ✗ ts-node server.ts 
/home/d1y/cat/coface/code/next/server.ts:10
import koa from 'koa';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at Module._compile (internal/modules/cjs/loader.js:892:18)
    at Module.m._compile (/usr/node/node-v12.13.0-linux-x64/lib/node_modules/ts-node/src/index.ts:536:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Object.require.extensions.<computed> [as .ts] (/usr/node/node-v12.13.0-linux-x64/lib/node_modules/ts-node/src/index.ts:539:12)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at main (/usr/node/node-v12.13.0-linux-x64/lib/node_modules/ts-node/src/bin.ts:212:14)
    at Object.<anonymous> (/usr/node/node-v12.13.0-linux-x64/lib/node_modules/ts-node/src/bin.ts:470:3)
    at Module._compile (internal/modules/cjs/loader.js:956:30)

my tsconfig.json file

{
  "compilerOptions": {
    "target": "es6",
    "lib": [
      "es6"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "es2015",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "noImplicitAny": true
  },
  "exclude": [
    "node_modules"
  ],
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx"
  ]
}

Why is this?

@d1y
Copy link
Author

d1y commented Dec 3, 2019

@blakeembrey

@blakeembrey
Copy link
Member

blakeembrey commented Dec 3, 2019

You’re trying to execute use it as an ES2015 module, but node.js currently understands CommonJS.

@blakeembrey
Copy link
Member

Added documentation: https://github.com/TypeStrong/ts-node#syntaxerror.

@xeruf
Copy link

xeruf commented Jan 7, 2020

Having the same problem even when using commonjs

	"compilerOptions": {
		/* Basic Options */
		"target": "es2016",
		/* Specify ECMAScript target version: 'ES3' (default),	'ES5',	'ES2015',	'ES2016',	'ES2017',	'ES2018' or 'ESNEXT'. */
		"module": "commonjs",

My project is an expo react-native project, but that shouldn't make a difference.

But the error does seem to come from a dependency:

.../node_modules/expo-constants/build/Constants.js:1
import { AppOwnership, UserInterfaceIdiom, } from './Constants.types';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at Module._compile (internal/modules/cjs/loader.js:895:18)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)

@Nditah
Copy link

Nditah commented Jan 7, 2020

Update 3: Since Node 13, you can use either the .mjs extension or set "type": "module" in your package.json. You don't need to use the --experimental-modules flag.

Update 2: Since Node 12, you can use either the .mjs extension or set "type": "module" in your package.json. And you need to run node with the --experimental-modules flag.

Update: In Node 9, it is enabled behind a flag, and uses the .mjs extension.

node --experimental-modules my-app.mjs

https://stackoverflow.com/questions/39436322/node-js-syntaxerror-unexpected-token-import?rq=1

@xeruf
Copy link

xeruf commented Jan 9, 2020

Thanks, I got it fixed that way!

@icemars123
Copy link

I had the same problem when I started to used babel... But later, I had a solution... I haven't had the problem anymore so far... Currently, Node v12.14.1, "@babel/node": "^7.8.4", I use babel-node and nodemon to execute (node is fine as well..)

package.json:
"start": "nodemon --exec babel-node server.js
"debug": "babel-node debug server.js" !!note: server.js is my entry file, you can use yours.

launch.json:
When you debug, you also need to config your launch.json file
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/babel-node"

Of course, with babel-node, you also normally need and edit another file, such as babel.config.js/.babelrc file

@dimahali
Copy link

dimahali commented Mar 3, 2020

I had the same problem and somehow fixed it. I have written a post about this, hope this helps https://xperimentalhamid.com/how-do-i/fix-cannot-use-import-statement-outside-a-module/

@mfahad24
Copy link

I had the same problem and somehow fixed it. I have written a post about this, hope this helps https://xperimentalhamid.com/how-do-i/fix-cannot-use-import-statement-outside-a-module/

.mjs extension worked for me, thank you!!

@haouarihk
Copy link

i keep getting this error when i import react in node for some reason
in my project
``
import React from 'react'
^^^^^^

SyntaxError: Cannot use import statement outside a module
``

@kaiyuan0708
Copy link

Do u solve this?

@htolajide
Copy link

If its an express project make this the last line in your server.js or app.js file
module.exports = app;
where app is from declared earlier, this this can be any valid variable but here app is used.
const app = express();

@nxpatterns
Copy link

To load an ES module, set "type": "module" in the package.json or use the .mjs extension.

@davidwoodward
Copy link

"type": "module" works, but only works if you are using Node v13.9.0 or above.

@fuadnafiz98
Copy link

Add .babelrc to root folder

  • ~/.babelrc
{
  "presets": ["env", "stage-0"]
}

my package.json

  • ~/package.json
"scripts": {
    "watch": "nodemon --exec babel-node src/index.js"
  },
  "dependencies": {
    "dotenv": "^8.2.0",
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-stage-0": "^6.24.1",
    "nodemon": "^2.0.3"
  }

@tokland
Copy link

tokland commented Jul 31, 2020

When using a tsconfig.json, you may override just the module setting like this:

$ npx ts-node -O '{"module":"commonjs"}' my-script.ts

@Dravere
Copy link

Dravere commented Aug 12, 2020

In case you stumble upon this and don't want to change the module option to commonjs because this will mess with your tree shaking in webpack. You can have more than one tsconfig.json. ts-loader supports a config entry named configFile. There is also a possibility for extending tsconfig.json files.

In my case I had a vue project and I wanted to test some parts of it with mocha/chai. I created a tsconfig.base.json with the common options. The tsconfig.json file extends the base file and is setup to run with mocha. It's module setting is set to commonjs. Additionally I created a tsconfig.webpack.json extending the base file that has its module config set to es2015 that is provided to configFile in the ts-loader options. I changed no other options anywhere else, so no type: "module" in package.json that was mentioned in this issue since this would interfere with webpack 4.x.

Also as additional info ts-node supports providing a different tsconfig.json via the -P or --project command line option.

@cspotcode
Copy link
Collaborator

@Dravere we also support overriding compilerOptions inside the same tsconfig, which will only apply to ts-node. So you can keep it all in a single tsconfig file if you want.

{
  "ts-node": {
    // these options are overrides used only by ts-node
    // same as our --compilerOptions flag and our TS_NODE_COMPILER_OPTIONS environment variable
    "compilerOptions": {
      "module": "commonjs"
    }
  },
  "compilerOptions": {
    "module": "esnext"
  }

@Dravere
Copy link

Dravere commented Aug 12, 2020

@cspotcode Oh, that is amazing. Thanks for that hint. Learned a lot about Typescript and ts-node while trying to fix that problem.

jkasten2 added a commit to OneSignal/OneSignal-Website-SDK that referenced this issue Mar 14, 2021
* This was required to run ava tests as .ts file
   - Fixes "SyntaxError: Cannot use import statement outside a module"
* Found this as work around noted here
   - TypeStrong/ts-node#922 (comment)
@iltonbarbosa
Copy link

I have the same problem

@iltonbarbosa
Copy link

I am experiencing this error when using a postinstall script in a node_module, I am under the impression that maybe ts-node call in package.json of node_module is picking up the tsconfig.json of the parent rather than it's local one?

The parent repo has module: es2020 in config because it is an AngularJS project, whereas the child is just a pure CommonJS style project.

Estou com este mesmo problema no nodejs. Alguém pode me ajudar, por favor?

rgomezp pushed a commit to OneSignal/OneSignal-Website-SDK that referenced this issue Mar 25, 2021
* This was required to run ava tests as .ts file
   - Fixes "SyntaxError: Cannot use import statement outside a module"
* Found this as work around noted here
   - TypeStrong/ts-node#922 (comment)
rgomezp pushed a commit to OneSignal/OneSignal-Website-SDK that referenced this issue Mar 29, 2021
* This was required to run ava tests as .ts file
   - Fixes "SyntaxError: Cannot use import statement outside a module"
* Found this as work around noted here
   - TypeStrong/ts-node#922 (comment)
rgomezp pushed a commit to OneSignal/OneSignal-Website-SDK that referenced this issue Apr 9, 2021
* This was required to run ava tests as .ts file
   - Fixes "SyntaxError: Cannot use import statement outside a module"
* Found this as work around noted here
   - TypeStrong/ts-node#922 (comment)
@acomito
Copy link

acomito commented Jul 26, 2021

I get

Unknown compiler option 'ts-node'

When I try this

{
  "compilerOptions": {
    "module": "esnext",
    "moduleResolution": "node",
    "target": "es2017",
    "outDir": "./dist",
    "lib": ["es6"],
    "types": ["node", "graphql", "express"],
    "typeRoots": ["./node_modules/@types", "./src/@types"],
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "emitDecoratorMetadata": true,
    "resolveJsonModule": true,
    "pretty": true,
    "sourceMap": true,
    "esModuleInterop": true,
    "isolatedModules": true,
    "allowJs": true,
    "ts-node": {
      "compilerOptions": {
        "module": "commonjs"
      }
    },
  },
  "include": ["src/entities/**/*.ts", "src/**/*.ts", "src/**/*.js", "./index.ts"],
  "exclude": ["node_modules","ormlogs.log", "dist"]
}

@fspoettel
Copy link

@acomito the ts-node key needs to be set on the top-level, not nested in compilerOptions.

@RahulChouhan96
Copy link

RahulChouhan96 commented Sep 4, 2021

Update 3: Since Node 13, you can use either the .mjs extension or set "type": "module" in your package.json. You don't need to use the --experimental-modules flag.

Update 2: Since Node 12, you can use either the .mjs extension or set "type": "module" in your package.json. And you need to run node with the --experimental-modules flag.

Update: In Node 9, it is enabled behind a flag, and uses the .mjs extension.

node --experimental-modules my-app.mjs

https://stackoverflow.com/questions/39436322/node-js-syntaxerror-unexpected-token-import?rq=1

How am I supposed to use mjs extension for the ts file? There is typescript-specific code present (like setting type) which is not possible in mjs or in any other file type.

For eg. I got these two errors
SyntaxError: Unexpected token ':' and
Type annotations can only be used in TypeScript files.ts(8010)
in this code, when I changed extension form ts to mjs

function run(): void {   // <------- Colon (:) is causing SyntaxError: Unexpected token ':' and
                         //          void is causing error Type annotations can only be used in TypeScript files.ts(8010)
      // Some code
}

@Nditah

@xiaoshude
Copy link

@Dravere we also support overriding compilerOptions inside the same tsconfig, which will only apply to ts-node. So you can keep it all in a single tsconfig file if you want.

{
  "ts-node": {
    // these options are overrides used only by ts-node
    // same as our --compilerOptions flag and our TS_NODE_COMPILER_OPTIONS environment variable
    "compilerOptions": {
      "module": "commonjs"
    }
  },
  "compilerOptions": {
    "module": "esnext"
  }

this works! thanks a lot!

@quizdeveloper
Copy link

I got the same error because I have imported a lib with syntax import ... from and after I change to require() that bug is solved for me. You can see more detail here

DevenWen pushed a commit to DevenWen/phaser3-typescript-parcel-template that referenced this issue Nov 21, 2021
@ialiaslani
Copy link

i got the same error because I forgot to set extname in file that I was Importing

@leonheess
Copy link

What if I can't go back to module: 'commonjs'?

https://stackoverflow.com/questions/72147353/how-to-use-normal-imports-and-top-level-await-at-the-same-time

@eden-lane
Copy link

@Dravere we also support overriding compilerOptions inside the same tsconfig, which will only apply to ts-node. So you can keep it all in a single tsconfig file if you want.

when I do this, I get error:

Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', or 'nodenext', and the 'target' option is set to 'es2017' or higher.

@airtonix
Copy link

airtonix commented Apr 24, 2023

This is pretty hilarious:

😸 hey bro, we got this tool that lets you run typescript on the cli!!!

🧑‍💻 Amazeballs! proceeds to type standard typescript with imports in a .ts file

💻 Error you are fail, re-evaluate life choices

🧑‍💻 🕸️ OMG QQ WTFBBQ, what is this error: ....

lib author: ./wontfix

Other Rando on the internet commenting on a typescript tool: hey lol use .mjs 👍🏻 👍🏻 👍🏻 👍🏻

🧑‍💻 ._. dude, this is typescript.

Yet Another Rando on the internet commenting on a typescript tool: hey lol add a .babelrc lmao 👍🏻 👍🏻 👍🏻 👍🏻

🧑‍💻 ./leavesbuilding

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests