Невозможно использовать инструкцию import вне модуля

I’m trying to use classes in pure JavaScript, so I’m facing the error «Uncaught SyntaxError: Cannot use import statement outside a module» and can’t solve it.

File1.js — Main file

import example from "./file2";

var test = new example();

File2.js — Class file

export default class example {
    constructor() {
        console.log("hello world");
    }
}

asked Oct 12, 2019 at 19:53

Walter Dudley's user avatar

2

Add files with type="module":

<script src="file1.js" type="module" ></script>

KyleMit's user avatar

KyleMit

33.8k65 gold badges461 silver badges660 bronze badges

answered Oct 12, 2019 at 19:56

marzelin's user avatar

marzelinmarzelin

10.7k2 gold badges30 silver badges49 bronze badges

5

A little late, but for newcomers to this quandary, you can convert both files to a module js .mjs. From there you can do what you were trying:

File1.mjs — Main file

import example from "./file2.mjs";

File2.mjs — Class file

export default class example {
    constructor() {
        console.log("hello world");
    }
}

answered Jan 27, 2022 at 16:37

Mister Pea's user avatar

Mister PeaMister Pea

1241 silver badge4 bronze badges

I am getting this error SyntaxError: Cannot use import statement outside a module when trying to import from another javascript file. This is the first time I’m trying something like this. The main file is main.js and the module file is mod.js.

main.js:

import * as myModule from "mod";
myModule.func();

mod.js:

export function func(){
    console.log("Hello World");
}

How can I fix this? Thanks

asked Jun 20, 2020 at 16:56

Serket's user avatar

3

In order to use the import syntax (ESModules), you need to add the following to your package.json at the top level:

{
    // ...
    "type": "module",
}

If you are using a version of Node earlier than 13, you additionally need to use the --experimental-modules flag when you run the program:

node --experimental-modules program.js

answered Jun 20, 2020 at 17:02

Achraf Ghellach's user avatar

Achraf GhellachAchraf Ghellach

1,6261 gold badge8 silver badges6 bronze badges

6

Use commonjs syntax instead of es module syntax:

module.exports.func = function (){
    console.log("Hello World");
}

and

const myMod = require("./mod")
myMod.func()

Otherwise, if you want to use es modules you have to do as the answer by Achraf Ghellach suggests

answered Jun 20, 2020 at 17:07

gautam1168's user avatar

gautam1168gautam1168

6117 silver badges15 bronze badges

4

I recently encountered this problem. This solution is similar to the top rated answer but with some ways I found worked for me.

In the same directory as your modules create a package.json file and add "type":"module". Then use import {func} from "./myscript.js";. The import style works when run using node.

answered Jun 10, 2021 at 9:17

ro_alli's user avatar

For browser(front end):
add type = «module» inside your script tag i.e

<script src="main.js" type="module"></script>

For nodejs:
add "type": "module", in your package.json file

answered May 16, 2022 at 4:18

kob003's user avatar

kob003kob003

1,9562 gold badges11 silver badges19 bronze badges

In addition to the answers above, note by default(if the «type» is omitted) the «type» is «commonjs». So, you have explicitly specify the type when it’s «module». You cannot use an import statement outside a module.

answered Apr 19, 2021 at 21:35

Lekia's user avatar

LekiaLekia

951 silver badge12 bronze badges

If you are in the browser (instead of a Node environment), make sure you specify the type="module" attribute in your script tag. If you want to use Babel, then it must be type="text/babel" data-plugins="transform-es2015-modules-umd" data-type="module".

answered Apr 7, 2022 at 21:56

Simone's user avatar

SimoneSimone

1,2301 gold badge16 silver badges27 bronze badges

I had this issue trying to run mocha tests with typescript. This isn’t directly related to the answer but may help some.

This article is quite interesting. He’s using a trick involving cross-env, that allows him to run tests as commonjs module type. That worked for me.

// package.json
{
  ...
  "scripts": {
    "test": "cross-env TS_NODE_COMPILER_OPTIONS='{ "module": "commonjs" }' mocha -r ts-node/register -r src/**/*.spec.ts"
  }
}

answered Feb 10, 2022 at 14:50

johnnyBoy's user avatar

johnnyBoyjohnnyBoy

1152 silver badges12 bronze badges

0

I got the same issue but in another module (python-shell).
I replaced the code as follows:

import {PythonShell} from 'python-shell'; (original code)
let {PythonShell} = require('python-shell')

That solved the issue.

answered Apr 8, 2022 at 21:12

Snowcat's user avatar

SnowcatSnowcat

4708 silver badges15 bronze badges

I’m trying to use classes in pure JavaScript, so I’m facing the error «Uncaught SyntaxError: Cannot use import statement outside a module» and can’t solve it.

File1.js — Main file

import example from "./file2";

var test = new example();

File2.js — Class file

export default class example {
    constructor() {
        console.log("hello world");
    }
}

asked Oct 12, 2019 at 19:53

Walter Dudley's user avatar

2

Add files with type="module":

<script src="file1.js" type="module" ></script>

KyleMit's user avatar

KyleMit

33.8k65 gold badges461 silver badges660 bronze badges

answered Oct 12, 2019 at 19:56

marzelin's user avatar

marzelinmarzelin

10.7k2 gold badges30 silver badges49 bronze badges

5

A little late, but for newcomers to this quandary, you can convert both files to a module js .mjs. From there you can do what you were trying:

File1.mjs — Main file

import example from "./file2.mjs";

File2.mjs — Class file

export default class example {
    constructor() {
        console.log("hello world");
    }
}

answered Jan 27, 2022 at 16:37

Mister Pea's user avatar

Mister PeaMister Pea

1241 silver badge4 bronze badges

На чтение 3 мин Просмотров 2.4к. Опубликовано 05 марта 2023

Ошибка “SyntaxError: Cannot use import statement outside a module” возникает, когда интерпретатор JavaScript встречает оператор import вне модуля.

В JavaScript модуль – это код, выполняемый в своей собственной области видимости, отдельной от глобальной области видимости. Операторы импорта могут использоваться только внутри модуля, но не в глобальной области видимости.

Эта ошибка может возникнуть в любой среде JavaScript, в том числе и в Node.js. Однако более вероятно ее появление в средах, которые не поддерживают использование операторов импорта в глобальной области видимости, например, в старых JavaScript-движках или браузерах.

Содержание

  1. Исправление для HTML
  2. Исправление для Node.js
  3. Исправление для TypeScript

Исправление для HTML

Чтобы устранить проблему для HTML-скриптов, необходимо установить атрибут type элемента <script>, чтобы указать тип скрипта, включенного в элемент.

Если атрибут type имеет значение “module”, браузер будет знать, что сценарий является модулем JavaScript, и будет выполнять его как таковой.

Это позволит вам использовать операторы импорта внутри сценария.

Вот пример:

<!-- when loading raw JS -->

<script type="module"></script>

<!-- when loading external files -->

<script type="module" src="assets/script.js"></script>

В качестве альтернативы вы можете использовать такой инструмент, как Babel, для транспонирования вашего кода, который преобразует утверждения импорта в более старый синтаксис, который можно использовать в глобальной области видимости. Затем вы можете включить транспонированный код в свой HTML-документ.

Исправление для Node.js

Чтобы использовать импорт модулей ES6 в Node.js, вы можете установить поле type в файле package.json вашего проекта, чтобы указать, что ваш проект использует модули ES6.

Вот пример:

{
  "name": "my-project",
  "type": "module",
  ...
}

После добавления поля type в файл package.json вы можете использовать оператор import в JavaScript-файлах вашего проекта без необходимости использования специальных флагов.

import myModule from './my-module';

// keep in mind that for local files, you have to append the .js extension to the module, like so:

import myModule from './my-module.js';

// if not you'll get the error: "[ERR_MODULE_NOT_FOUND]: Cannot find module".

Этот подход имеет несколько преимуществ. Во-первых, он не требует использования специальных флагов при запуске интерпретатора Node.js, что делает его более удобным. Во-вторых, он позволяет другим инструментам, таким как бандлеры и линтеры, распознать, что в вашем проекте используются модули ES6, что упрощает использование этих инструментов в вашем проекте.

Исправление для TypeScript

Чтобы использовать систему модулей CommonJS в проекте TypeScript, вам нужно включить опции компилятора allowSyntheticDefaultImports и esModuleInterop в конфиге TypeScript.

Эти опции позволяют TypeScript рассматривать импортируемые значения так, как будто они имеют экспорт по умолчанию, даже если они его не имеют, и использовать синтаксис импорта с модулями CommonJS.

tsconfig.json:
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    ...
  }
}

Эти параметры поддерживаются только в TypeScript 3.8 и более поздних версиях.

Другая возможность заключается в том, что вы пытаетесь запустить свои файлы TypeScript с помощью команды node, а не с помощью такого инструмента, как ts-node, для транспонирования и запуска.

В этом случае вы можете использовать ts-node для транспонирования и запуска ваших файлов, чтобы исправить ошибку.

Если у вас появились вопросы про то, как устранить ошибку “SyntaxError: Cannot use import statement outside a module”, мы будем рады ответить вам в комментариях ниже.

Table of Contents

Hide

  1. What is SyntaxError: cannot use import statement outside a module?
  2. How to fix SyntaxError: cannot use import statement outside a module?
    1. Solution 1 – Add “type”: “module” to package.json 
    2. Solution 2 – Add type=”module” attribute to the script tag
    3. Solution 3 – Use import and require to load the modules
  3. Configuration Issue in ORM’s
  4. Conclusion

The Uncaught SyntaxError: cannot use import statement outside a module mainly occurs when developers use the import statement on the CommonJS instead of require statement.

What is SyntaxError: cannot use import statement outside a module?

There are several reasons behind this error. First, let us look at each scenario and solution with examples.

  • If you are using an older Node version < 13
  • If you are using a browser or interface that doesn’t support ES6
  • If you have missed the type=”module” while loading the script tag
  • If you missed out on the “type”: “module” inside the package.json while working on Node projects

Many interfaces till now do not understand ES6 Javascript features. Hence we need to compile ES6 to ES5 whenever we need to use that in the project.

The other possible reason is that you are using the file that is written in the ES6 module directly inside your code. It means you are loading the src file/directory instead of referring to the dist directory, which leads to a SyntaxError.

Usually, we use a bundled or dist file that is compiled to ES5/Javascript file and then import the modules in our code.

How to fix SyntaxError: cannot use import statement outside a module?

There are 3 ways to solve this error. Let us take a look at each of these solutions.

Solution 1 – Add “type”: “module” to package.json 

If you are working on Node.js or react applications and using import statements instead of require to load the modules, then ensure your package.json has a property "type": "module" as shown below.

Adding “type”: “module” to package.json will tell Node you are using ES6 modules(es modules), which should get solve the error. 

If you would like to use the ES6 module imports in Node.js, set the type property to the module in the package.json file.

   {
        // ...
        "type": "module",
        // ...
    }

If you are using TypeScript, we need to edit the tsconfig.json file and change the module property to “commonjs“, as shown below.

ts.config file

Change the ts.config file as shown below to resolve the Uncaught SyntaxError: cannot use import statement outside a module error.

    "target": "esnext",
    "module": "esnext",

to

    "target": "esnext",
    "module": "commonjs",

If this error mainly occurs in the TypeScript project, ensure that you are using a ts-node to transpile into Javascript before running the .ts file. Node.js can throw an error if you directly run the typescript file without transpiling.

Note: If your project does not have a package.json file, initialize it by using the npm init -y command in the root directory of your project.

Solution 2 – Add type=”module” attribute to the script tag

Another reason we get this error is if we are loading the script from the src directory instead of the built file inside the dist directory. 

It can happen if the src file is written in ES6 and not compiled into an ES5 (standard js file). The dist files usually will have the bundled and compiled files, and hence it is recommended to use the dist folder instead of src.

We can solve this error by adding a simple attribute type="module" to the script, as shown below.

<script type="module" src="some_script.js"></script>

Solution 3 – Use import and require to load the modules

In some cases, we may have to use both import and require statements to load the module properly.

For Example – 

    import { parse } from 'node-html-parser';
    parse = require('node-html-parser');

Note: When using modules, if you get ReferenceError: require is not defined, you’ll need to use the import syntax instead of require.

Configuration Issue in ORM’s

Another possible issue is when you are using ORM’s such as typeORM and the configuration you have set the entities to refer to the source folder instead of the dist folder.

The src folder would be of TypeScript file and referring the entities to .ts files will lead to cannot use import statement outside a module error.

Change the ormconfig.js to refer to dist files instead of src files as shown below.

 "entities": [
      "src/db/entity/**/*.ts", // Pay attention to "src" and "ts" (this is wrong)
   ],

to

  "entities": [
      "dist/db/entity/**/*.js", // Pay attention to "dist" and "js" (this is the correct way)
   ],

Conclusion

The Uncaught SyntaxError: cannot use import statement outside a module occurs if you have forgotten to add type="module" attribute while loading the script or if you are loading the src files instead of bundled files from the dist folder.

We can resolve the issue by setting the “type”: “module” inside the package.json while working on Node projects. If we are loading the Javascript file then we need to add the attribute type="module" to the script tag.

Related Tags
  • import,
  • require,
  • SyntaxError

Sign Up for Our Newsletters

Get notified on the latest articles

By checking this box, you confirm that you have read and are agreeing to our terms of use regarding the storage of the data submitted through this form.

Понравилась статья? Поделить с друзьями:
  • Невотон мк 37 инструкция по применению видео
  • Невис актив таблетки инструкция по применению
  • Невотон мк 37 гао инструкция по применению
  • Невис актив таблетки для детей инструкция
  • Невотон мк 37 2 цирконий инструкция по применению