JavaScript модулей импорт / экспорт - PullRequest
1 голос
/ 16 апреля 2020

Я только что узнал о модулях в JS. Я пытаюсь заставить это работать на моей машине, и у меня все еще есть пара вопросов, потому что это работает только в определенных случаях.

Я видел и пробовал примеры из видео YouTube со следующим синтаксисом:

// number.js
export const num = 5;

// main.js
import { num } from './number.js'


//This throws the following error:

import { num } from './number.js';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1072:16)
    at Module._compile (internal/modules/cjs/loader.js:1122:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47

С моей стороны это работает только тогда, когда я делаю это:

// number.js
const num = 10;
module.exports =  { num };

// main.js
const num = require('./number.js');

Может ли кто-нибудь просветить меня и сказать мне, в чем разница, и если я делаю это технически правильно?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Ваши объявления export и import в порядке, просто среда не знает, что main.js предназначен для использования в качестве модуля.

Если вы делаете это на Node.js, подробности смотрите в их документации , но краткая версия либо вставляется "type": "module" в package.json, либо используется расширение .mjs.

Если вы делаете это в браузере тег script для файла main.js должен иметь type="module", чтобы механизм JavaScript знал, что это модуль. Вот живой пример на CodeSandbox. :

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <script src="./main.js" type="module"></script>
    <title>Export / Import Example</title>
  </head>
  <body></body>
</html>

main.js:

import { num } from "./number.js";

document.body.appendChild(document.createTextNode(`num = ${num}`));

number.js:

export const num = 5;

(Обратите внимание, что поскольку type="module" автоматически откладывает скрипт, нет необходимости помещать его в конец body, как вы делаете с немодульными скриптами.)

0 голосов
/ 16 апреля 2020
Функция

module.exports () является функцией по умолчанию, которая поставляется с nodejs и является частью модуля require js. С другой стороны, импорт и экспорт - это больше возможностей ES6 и выше, для которых, я полагаю, вам понадобится либо модуль webpack, либо модуль babel, чтобы преобразовать его в обычный синтаксис ES5, который механизм визуализации браузера может понять во время выполнения. Вот ссылка на два вышеуказанных модуля.

webpack - https://webpack.js.org/

babel - https://babeljs.io/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...