Załóżmy, że mam plik o nazwie app.js. Dość proste:
var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
res.render('index', {locals: {
title: 'NowJS + Express Example'
}});
});
app.listen(8080);
Co jeśli mam funkcje wewnątrz „tools.js”. Jak mam je zaimportować do użycia w apps.js?
A może… czy mam zamienić „narzędzia” w moduł, a następnie go potrzebować? << wydaje się trudne, raczej wykonuję podstawowy import pliku tools.js.
javascript
import
header
node.js
TIMEX
źródło
źródło
require
umieszczenie folderu w tym samym katalogu w systemie Windows. Musisz użyć adresowania w stylu uniksowym:./mydir
zamiast zwykłego staregomydir
.node_modules
folderu zewnętrznego . npmjs.com/package/node-import Mam nadzieję, że może pomóc. Dzięki!Odpowiedzi:
Możesz wymagać dowolnego pliku js, wystarczy zadeklarować, co chcesz udostępnić.
A w pliku aplikacji:
źródło
require("http://javascript-modules.googlecode.com/svn/functionChecker.js")
nie wydaje się poprawnie importować modułu. Czy istnieje jakiś inny sposób importowania zewnętrznych skryptów?Jeśli pomimo wszystkich innych odpowiedzi nadal chcesz tradycyjnie dołączyć plik do pliku źródłowego node.js, możesz użyć tego:
+''
jest konieczne, aby uzyskać zawartość pliku jako ciąg, a nie obiekt (możesz także użyć.toString()
jeśli wolisz).include()
funkcji narzędzia lub czegoś takiego).Pamiętaj, że w większości przypadków jest to zła praktyka i powinieneś zamiast tego napisać moduł . Jednak zdarzają się rzadkie sytuacje, w których zanieczyszczenie lokalnego kontekstu / przestrzeni nazw jest tym, czego naprawdę chcesz.
Aktualizacja 2015-08-06
Pamiętaj też, że to nie zadziała
"use strict";
(gdy jesteś w „trybie ścisłym” ), ponieważ funkcje i zmienne zdefiniowane w „importowanym” pliku nie są dostępne przez kod, który dokonuje importu. Tryb ścisły wymusza niektóre reguły określone przez nowsze wersje standardu językowego. Może to być kolejny powód do uniknięcia opisanego tutaj rozwiązania.źródło
Nie potrzebujesz żadnych nowych funkcji ani nowych modułów. Musisz po prostu uruchomić moduł, do którego dzwonisz, jeśli nie chcesz używać przestrzeni nazw.
w tools.js
w app.js
lub w dowolnym innym .js, takim jak myController.js:
zamiast
var tools = require('tools.js')
które zmuszają nas do korzystania z przestrzeni nazw i wywoływania narzędzi takich jaktools.sum(1,2);
możemy po prostu zadzwonić
i wtedy
w moim przypadku mam plik ze sterownikami ctrls.js
i mogę używać
Categories
w każdym kontekście jako klasy publicznej porequire('ctrls.js')()
źródło
this
w funkcji jest zasięg globalny, gdy funkcja jest wywoływana bezpośrednio (nie jest w żaden sposób powiązana).require('blah.js')();
powinien pozwól mi zaimportować je wszystkie w tym samym zakresie !!! dzięki!!!Utwórz dwa pliki js
Główny plik js
Wyjście konsoli
źródło
Oto proste i proste wyjaśnienie:
Zawartość Server.js:
Zawartość Helpers.js:
źródło
Szukałem również funkcji włączania NodeJS i sprawdziłem rozwiązanie zaproponowane przez Udo G - patrz komunikat https://stackoverflow.com/a/8744519/2979590 . Jego kod nie działa z moimi dołączonymi plikami JS. Wreszcie rozwiązałem problem w ten sposób:
Jasne, że to pomaga.
źródło
utwórz dwa pliki np.
app.js
itools.js
app.js
tools.js
wynik
źródło
powiedzieć, że chce wywołać funkcję ping () i dodać (30,20) , który jest w lib.js pliku z main.js
main.js
lib.js
źródło
Moduł vm w Node.js zapewnia możliwość wykonywania kodu JavaScript w bieżącym kontekście (w tym obiekcie globalnym). Zobacz http://nodejs.org/docs/latest/api/vm.html#vm_vm_runinthiscontext_code_fil_filename
Zauważ, że na dzień dzisiejszy w module vm występuje błąd, który uniemożliwia runInThisContext wykonanie prawidłowej operacji po wywołaniu z nowego kontekstu. Ma to znaczenie tylko wtedy, gdy główny program wykonuje kod w nowym kontekście, a następnie wywołuje kod runInThisContext. Zobacz https://github.com/joyent/node/issues/898
Niestety sugerowane przez Fernando podejście z (globalnym) nie działa dla nazwanych funkcji, takich jak „function foo () {}”
Krótko mówiąc, oto funkcja include (), która działa dla mnie:
źródło
Udo G. powiedział:
Ma rację, ale istnieje sposób, aby wpłynąć na zasięg globalny z funkcji. Poprawiając swój przykład:
Mam nadzieję, że to pomaga.
źródło
Działa ze mną w następujący sposób ...
Lib1.js
teraz w pliku Main.js musisz dołączyć Lib1.js
Pamiętaj, aby umieścić plik Lib1.js w folderze node_modules .
źródło
Możesz umieścić swoje funkcje w zmiennych globalnych, ale lepiej jest po prostu zmienić skrypt narzędzi w moduł. To naprawdę nie jest zbyt trudne - wystarczy podłączyć swój publiczny interfejs API do
exports
obiektu. Spójrz na moduł eksportu Zrozumienie Node.js, aby uzyskać więcej szczegółów.źródło
Moim zdaniem innym sposobem na zrobienie tego jest wykonanie wszystkiego w pliku lib, gdy wywołasz funkcję wymagającą () za pomocą (function (/ * rzeczy tutaj * /) {}) (); robi to uczyni wszystkie te funkcje, zakres globalny, dokładnie jak eval () rozwiązanie
src / lib.js
A potem w głównym kodzie możesz wywoływać swoje funkcje według nazw takich jak:
main.js
Sprawi, że ten wynik
Zwróć uwagę na niezdefiniowane, gdy wywołasz mój obiekt.funcFour () , będzie tak samo, jeśli załadujesz eval () . Mam nadzieję, że to pomoże :)
źródło
Chcę tylko dodać, na wypadek, gdybyś potrzebował tylko niektórych funkcji zaimportowanych z twoich narzędzi.js. , możesz użyć przypisania destrukcyjnego, które jest obsługiwane w node.js od wersji 6.4 - patrz node.green .
Przykład : (oba pliki znajdują się w tym samym folderze)
wynik:
true
Pozwala to również uniknąć przypisywania tych funkcji jako właściwości innego obiektu, jak ma to miejsce w przypadku następującego (powszechnego) przypisania:
const tools = require('./tools.js');
gdzie musisz zadzwonić
tools.isEven(10)
.UWAGA:
Nie zapomnij o prefiksie nazwy pliku poprawną ścieżką - nawet jeśli oba pliki znajdują się w tym samym folderze, musisz użyć prefiksu
./
Z dokumentów Node.js :
źródło
app.js
tools.js
źródło
Dołącz plik i uruchom go w określonym (nieglobalnym) kontekście
fileToInclude.js
main.js
źródło
To najlepszy sposób, jaki do tej pory stworzyłem.
Nadal musisz poinformować, co chcesz wyeksportować
źródło
Jak masz plik
abc.txt
i wiele innych?Utwórz 2 pliki:
fileread.js
afetchingfile.js
następniefileread.js
napisz ten kod:W
fetchingfile.js
napisać ten kod:Teraz w terminalu: $ node fetchingfile.js --file = abc.txt
Podajesz nazwę pliku jako argument, a ponadto dołącz wszystkie pliki
readfile.js
zamiast przekazać.Dzięki
źródło
Możesz po prostu po prostu
require('./filename')
.Na przykład.
Proszę to zanotować:
źródło
Ja również szukałem opcji włączenia kodu bez pisania modułów, odpowiednio. użyj tych samych przetestowanych niezależnych źródeł z innego projektu dla usługi Node.js - i odpowiedź jmparatte zrobiła to dla mnie.
Korzyścią jest to, że nie zanieczyszczasz przestrzeni nazw, z którą nie mam problemów
"use strict";
i działa dobrze.Tutaj pełny próbka:
Skrypt do załadowania - /lib/foo.js
SampleModule - index.js
Mam nadzieję, że to jakoś pomogło.
źródło
Inna metoda przy użyciu frameworka node.js i express.js
przechowuj to w pliku js o nazwie s oraz w statystyce folderów
Teraz, aby użyć funkcji
źródło
Opracowałem dość prymitywną metodę obsługi tego szablonu szablonów HTML. Podobnie jak PHP
<?php include("navigation.html"); ?>
źródło
Jeśli chcesz skorzystać z wielu procesorów i architektury Microservice, aby przyspieszyć ... Używaj RPC zamiast rozwidlonych procesów.
Brzmi skomplikowanie, ale jest to proste, jeśli używasz ośmiornicy .
Oto przykład:
na tools.js dodaj:
w app.js dodaj:
ujawnienie - jestem autorem ośmiornicy i zbudowałem go dla mojego podobnego zastosowania, ponieważ nie mogłem znaleźć żadnych lekkich bibliotek.
źródło
Aby zmienić „narzędzia” w moduł, wcale nie widzę tak mocno. Mimo wszystkich innych odpowiedzi nadal polecam użycie modułu. Eksportuje:
Teraz musimy przypisać ten eksport do zakresu globalnego (w Twojej aplikacji | index | server.js)
Teraz możesz odwoływać się i wywoływać funkcję jako:
źródło
Posługiwać się:
app.js:
źródło
./tools.js