Client on node: Uncaught ReferenceError: require nie jest zdefiniowany
Więc piszę aplikację z Kombi node / express + jade.
Mam client.js
, który jest załadowany na klienta. W tym pliku Mam kod, który wywołuje funkcje z innych plików JavaScript. Moją próbą było użycie
var m = require('./messages');
W celu załadowania zawartości messages.js
(tak jak robię po stronie serwera), a później wywołania funkcji z tego pliku. Jednak {[3] } nie jest zdefiniowana po stronie klienta, i rzuca błąd w postaci Uncaught ReferenceError: require is not defined
.
Te inne pliki JS to również ładowane na runtime u klienta, ponieważ umieszczam linki w nagłówku strony internetowej. Więc klient zna wszystkie funkcje, które są eksportowane z tych innych plików.
Jak wywołać te funkcje z innych plików JS (takich jak messages.js
) w głównym pliku client.js
, który otwiera gniazdo na serwer?
4 answers
Dzieje się tak dlatego, że require()
nie istnieje w JavaScript po stronie przeglądarki/klienta.
Teraz będziesz musiał dokonać pewnych wyborów dotyczących zarządzania skryptami JavaScript po stronie klienta.
Masz trzy opcje:
- użyj znacznika
<script>
. - użyj implementacji CommonJS. Synchroniczne zależności jak Node.js
- użyj implementacji AMD .
CommonJS Po stronie klienta-implementacje obejmują:
(Większość z nich wymaga kroku kompilacji przed wdrożeniem)
- Browserify - możesz użyć większości węzłów.Moduły js w przeglądarce. To mój ulubiony.
- Webpack - robi wszystko (Pakiety JS, CSS, itp.). Stał się popularny dzięki fali Reacta.js. Znany ze swojej trudnej krzywej uczenia się.
- Rollup - nowy zawodnik. Wykorzystuje moduły ES6. Zawiera umiejętności drżenia drzew (usuwa nieużywany kod).
Możesz przeczytać więcej o moim porównanie [[41]}Browserify vs Component.
Implementacje AMD obejmują:
- RequireJS - bardzo popularny wśród programistów JavaScript po stronie klienta. Nie w moim guście ze względu na jego asynchroniczną naturę.
Uwaga, w poszukiwaniu wyboru, który z nich wybrać, przeczytasz o Bower . Bower jest przeznaczony tylko dla zależności pakietów i nie jest opinionowany na definicjach modułów, takich jak CommonJS i AMD.
Mam nadzieję, że to pomoże trochę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 22:21:33
ES6: w html Dołącz główny plik js za pomocą atrybutu type="module"
(Obsługa przeglądarek):
<script type="module" src="script.js"></script>
I w script.js
pliku Dołącz inny plik o tym samym numerze:
import { hello } from './module.js';
...
// alert(hello());
W 'module.js ' musisz wyeksportować funkcję / klasę którą zaimportujesz
export function hello() {
return "Hello World";
}
Praca przykład tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 09:07:10
W moim przypadku użyłem innego rozwiązania.
Ponieważ projekt nie wymaga CommonJs i musi mieć kompatybilność z ES3 (Moduły nie są obsługiwane), wystarczy usunąć wszystkie export i import z twojego kodu, ponieważ tsconfig nie zawiera
"module": "commonjs"
Ale używaj instrukcji importu i eksportu w plikach, do których się odwołujesz
import { Utils } from "./utils"
export interface Actions {}
Końcowy wygenerowany kod będzie zawsze miał (przynajmniej dla typescript 3.0) takie linie
"use strict";
exports.__esModule = true;
var utils_1 = require("./utils");
....
utils_1.Utils.doSomething();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 02:04:29
Even using this won't work , I think the best solution is browserify
-common.js-
module.exports = {
func1: function () {
console.log("I am function 1");
},
func2: function () {
console.log("I am function 2");
}
};
-getFunc1.js-
var common = require('./common');
common.func1();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-26 08:01:40