Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как импортировать файлы js (https://javascript.ru/forum/node-js-io-js/84244-kak-importirovat-fajjly-js.html)

noveek 19.07.2022 09:01

Как импортировать файлы js
 
Здравствуйте, как импортировать файлы и использовать функции из них:

Содержимое Файла который лежит в папке с программой:
// module1.js

// При добавлении ключевого слова export
// выражение становится экспортированным.
export function sum(a, b) {
  return a + b
}

// Экспортировать можно не только функции,
// но и константы:
export const SOME_SETTINGS_FLAG = false
export const user = {}
export const books = ["Война и мир", "Мастер и Маргарита"]


import ("./module1.js"); // файл лежит в папке с программой
books; // не работает (

ksa 19.07.2022 10:33

Цитата:

Сообщение от noveek
как импортировать файлы и использовать функции из них

Это все описано в букваре...
https://habr.com/ru/company/domclick/blog/532084/

noveek 19.07.2022 11:26

Цитата:

Сообщение от ksa (Сообщение 546726)
Это все описано в букваре...
https://habr.com/ru/company/domclick/blog/532084/

У меня просто возникает ошибка и я не понимаю почему:

Error $30002: JavaScript failed to compile.
Name: SyntaxError
Message: 'import' or 'export' can only be used in module code.
Source:  import * as customName from ("./module1.js");
Line: 0
Column: 1

ksa 19.07.2022 11:37

Цитата:

Сообщение от noveek
import ("./module1.js"); // файл лежит в папке с программой
books; // не работает (

Для работы с books импорт должен выглядеть так
import {books} from "./module1.js";

ksa 19.07.2022 11:39

Цитата:

Сообщение от noveek
я не понимаю почему

Тебе явно пишут
Цитата:

Сообщение от noveek
SyntaxError

Т.е., грубо говоря, ты написал какую-то белиберду.

noveek 19.07.2022 11:43

Цитата:

Сообщение от ksa (Сообщение 546730)
Тебе явно пишут

Т.е., грубо говоря, ты написал какую-то белиберду.

Тоже самое:
import {books} from ("./module1.js");

Error $30002: JavaScript failed to compile.
Name: SyntaxError
Message: 'import' or 'export' can only be used in module code.
Source: import {books} from ("./module1.js");
Line: 0
Column: 0

voraa 19.07.2022 13:03

Мне кажется, в node модули должны иметь расширение .mjs, а не .js
Node не понимает, что module1.js - это модуль. И дает синтаксическую ошибку, что операторы export и import допустимы только в модулях.

ksa 19.07.2022 16:02

Там смотря какой режим "включен"... Если строгий - импорт. А по умолчанию работает рекваер...

const {books} = require("./module1.js")

Но и модуль тогда "оформляется" иначе
// 
function test() {
	//
}

module.exports = {test}

voraa 19.07.2022 16:42

При чем тут require?
Он же import использует.

ksa 19.07.2022 17:08

Цитата:

Сообщение от voraa
Он же import использует.

Но пока неудачно... :)

Вот статейка про то как перейти с require на import в Ноде.
https://habr.com/ru/company/ruvds/blog/556744/

Aetae 19.07.2022 20:21

Статью не открывал, но чтоб перейти в ноде с require на import достаточно в package.json дописать "type": "module", остальное лирика.)

noveek, ну и скобочки куда ни попадя пихать не надо. Просто
import { books } from "./module1.js";

noveek 19.07.2022 21:20

Пока ничего не помогло единственное вот так:
import ("./module1.js");

Выдаёт:
[object Promise]

ksa 19.07.2022 21:39

noveek, ты с упорством носорога делаешь совсем не то...
Почитай хоть статьи про работу с модулями...
Ссылки я тебе дал.
Да и тут уже много чего уже написали.

noveek 19.07.2022 22:22

Цитата:

Сообщение от ksa (Сообщение 546745)
noveek, ты с упорством носорога делаешь совсем не то...
Почитай хоть статьи про работу с модулями...
Ссылки я тебе дал.
Да и тут уже много чего уже написали.

Ссылки то дал, но там тоже самое написано что я делал натыкаюсь на ошибку

voraa 19.07.2022 23:06

Цитата:

Сообщение от noveek
Пока ничего не помогло

Не помогло переименование расширения в .mjs? Всех файлов, и тех, где export, и тех, где import.
Не помогло "type": "module" в package.json?

Цитата:

Сообщение от noveek
Выдаёт:
[object Promise]

А что он еще должен выдавать?
https://developer.mozilla.org/ru/doc...BE%D1%80%D1%82

noveek 19.07.2022 23:25

Цитата:

Сообщение от voraa (Сообщение 546749)
Не помогло переименование расширения в .mjs? Всех файлов, и тех, где export, и тех, где import.
Не помогло "type": "module" в package.json?

Нет =) Тут ситуация сложнее я использую JSEngine из под Delphi:
https://www.winsoft.sk/jsengine.htm
Из под него уже пытаюсь импортировать модули .js извините следовало сразу обрисовать всю ситуацию )
В свою очередь он использует ChakraCore https://github.com/chakra-core/ChakraCore
То есть скрипт из под Delphi выглядит так сейчас:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyObject: JsValueRef;
  Result: JsValueRef;
begin
try
Engine := TJSEngine.Create;
Memo1.Lines.Text:=Engine.ConvertToString(Engine.RunScript('import ("./module1.js");'));
except
on E: Exception do
ShowException(Memo2, E);
end
Engine.Free;
end;

Aetae 20.07.2022 04:42

Хз, если тебе пишет что незя использовать import - это одно, значит надо заставить твою хрень как-то воспринимать скрипт как модуль, консольная версия chakracore при беглом взгляде по issue вроде может это с параметром -es6module, как оный задать в твоей приблуде - хз, сам смотри.

Если же у тебя нормально запускаются скрипты с import - вопросы иной:
import "file.js"; в начале файла - импортировать простой скрипт(не модуль) в начале модуля.
import some from "file.js"; в начале файла - импортировать конкретное экспортированаое начение из модуля.
import("file.js") в любом месте - асинхронно запросить модуль и вернуть Promise разрешающийся в объект с экспортируемыми модулем значениями.

Как работать с асинхронными операциями - опять же - тебе самому разбираться.

noveek 20.07.2022 05:02

Цитата:

Сообщение от Aetae (Сообщение 546752)
Хз, если тебе пишет что незя использовать import - это одно, значит надо заставить твою хрень как-то воспринимать скрипт как модуль, консольная версия chakracore при беглом взгляде по issue вроде может это с параметром -es6module, как оный задать в твоей приблуде - хз, сам смотри.

Если же у тебя нормально запускаются скрипты с import - вопросы иной:
import "file.js"; в начале файла - импортировать простой скрипт(не модуль) в начале модуля.
import some from "file.js"; в начале файла - импортировать конкретное экспортированаое начение из модуля.
import("file.js") в любом месте - асинхронно запросить модуль и вернуть Promise разрешающийся в объект с экспортируемыми модулем значениями.

Как работать с асинхронными операциями - опять же - тебе самому разбираться.

Жалко что нельзя напрямую из .js это гораздо удобнее, но я решил грузить в stringlist из Delphi работает, но есть проблемы такие как:
Message: 'window' is not defined

Я понимаю что объект пустой так как я запускаю не через браузер, а вот чем заменить не понимаю пока:
Memo1.Lines.text:=StringReplace(Memo1.Lines.text, 'window', 'Object',[rfReplaceAll, rfIgnoreCase]);
Строка в скрипте например так идёт:
var hasStrongCrat = 'crat' in window && window['crat'] !== null;

Aetae 20.07.2022 05:51

this / global
Если и этого нет, то можно в начале самому задать и не париться особо: window = {};

Цитата:

Жалко что нельзя напрямую из .js
Вообще, уверен, что можно. Только reference на эту шляпу с полпинка не нагугливается, а ставить чисто ради тебя delphi я не буду, уж извини.)

noveek 20.07.2022 06:24

Цитата:

Сообщение от Aetae (Сообщение 546754)
this / global
Если и этого нет, то можно в начале самому задать и не париться особо: window = {};


Вообще, уверен, что можно. Только reference на эту шляпу с полпинка не нагугливается, а ставить чисто ради тебя delphi я не буду, уж извини.)

Там есть Демо скомпилированное уже необязательно дельфи ставить =)
https://www.winsoft.sk/download/jsenginedemo.zip там работает так просто в окно вписываешь скрипт нажимаешь кнопку Run =)

noveek 13.08.2022 13:25

Цитата:

Сообщение от Aetae
Если и этого нет, то можно в начале самому задать и не париться особо: window = {};

А чем можно заменить console.log console.warn например ?

Aetae 13.08.2022 17:31

noveek, чем хочешь. В нормально окружении они и так есть.

Тупо пиши руками
console = {
  log: function(){
    что-то(arguments)
  },
  warn: function() {
    что-то(arguments)
  }
}

Где "что-то" предоставляемый средой способ вывода в консоль\вывод в shell\вывод в лог\что хочешь.


Часовой пояс GMT +3, время: 14:14.