"Uncaught ReferenceError: ... не определено" при вызове класса (определенного в модуле) из консоли браузера, JS
У меня есть файл class.js
//implementation details
const _stackCollection = new WeakMap();
//interface
export class Stack {
constructor() {
_stackCollection.set(this, []);
}
get count() {
return _stackCollection.get(this).length;
}
pop() {
if (this.count === 0)
throw new Error('Nothing to pop');
return _stackCollection.get(this).pop();
}
peek() {
if (this.count === 0)
throw new Error('Nothing to peek');
return _stackCollection.get(this)[this.count - 1];
}
push(e) {
_stackCollection.get(this).push(e);
return;
}
}
и модуль, который импортирует данный класс, выглядит следующим образом: module.js:
import {Stack} from './class.js';
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">
<title>Document</title>
</head>
<body>
<h1>hello world</h1>
<script type="module" src='module.js'></script>
</body>
</html>
Когда я пытаюсь инициализировать экземпляр стека в консоли, я получаю следующую ошибку. Есть много вопросов относительно данной ошибки, но я не вижу ничего, что помогло бы мне:
const stack=new Stack()
Uncaught ReferenceError: Stack is not defined
at <anonymous>:1:13
2 ответа
Объявления в модуле относятся к этому модулю. Если вы хотите получить к ним доступ, вам нужно импортировать их.
Чтобы использовать такой экспорт в консоли браузера, вам необходимо импортировать его или связать с глобальной переменной.
global (обратите внимание, что это противоречит назначению модулей и должно использоваться только для специального тестирования)
export class A {}
// TODO: remove this
window.A = A;
С предложенным динамическим синтаксисом импорта:
// browser console:
import('./a.js').then(console.log);
С SystemJS
// browser console:
SystemJS.import('./a.js').then(console.log);
Спасибо всем за ваши комментарии. Как упомянул @AluanHaddad в комментарии, я не могу инициализировать класс объекта из консоли, как я пытался:
const stack=new Stack()
Вместо этого я могу инициализировать его в module.js, а затем ссылаться на него в объекте окна, как в ответе Aluan. Я переписал module.js таким образом:
import {Stack} from './class.js';
const c = new Stack();
c.push('a');
window.c = c;
и тогда я могу получить доступ к объекту с из консоли
>c
>Stack {}