javascript нельзя использовать импорт в chrome firefox и узле - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть эти 3 файла:

index. html

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

sayHi. js

function sayHi(user) {
    alert(`Hello, ${user}!`);
}
export {sayHi}; // a list of exported variables

main. js

import {sayHi} from './say.js';
sayHi('John'); // Hello, John!

Узел ошибки:

PS C:\Users\Roxanji\VScode\test4> node .\main.js
C:\Users\Roxanji\VScode\test4\main.js:2
import {sayHi} from './say.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

Ошибка в chrome:

Access to script at 'file:///C:/Users/Roxanji/VScode/test4/main.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
index.html:1 GET file:///C:/Users/Roxanji/VScode/test4/main.js net::ERR_FAILED

Ошибка в firefox:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at file:///C:/Users/Roxanji/VScode/test4/main.js. (Reason: CORS request not http).
2
Module source URI is not allowed in this document: “file:///C:/Users/Roxanji/VScode/test4/main.js”.

Где это работает: посылка и liveserver (тот, что в visualcode)

Как сделать так, чтобы он работал везде? особенно в узле?

1 Ответ

0 голосов
/ 01 апреля 2020

Причина, по которой модули не работают на узле и в браузерах, две:

  • Узел: если вы используете версию выше 13 (если я не ошибаюсь), у вас есть для ввода поля type присвоено значение module в package.json. Если вы используете предыдущую версию, вы должны использовать флаг --experimental-modules (я предлагаю вам прочитать документацию https://nodejs.org/docs/latest-v12.x/api/esm.html).

  • Браузер: Ошибки достаточно объяснительные: страница должна обслуживаться по протоколу http/s, а не file. По этой причине он работает с liveserver, но не с помощью прямого доступа к странице

...