Come navigare in un progetto JavaScript?


9

Attualmente sto lavorando a un progetto JavaScript utilizzando Backbone.js e mi chiedo come posso navigare tra i file, in base alle definizioni di metodi e oggetti.

Ad esempio, io continuo a riferimenti ad alcuni dei miei punti di vista in oggetto globale App.Views, e mi piacerebbe essere in grado di navigare ad ogni singola definizione ( App.Views.Home, App.Views.SomePage, ecc) se incontro uno. Inoltre, ci sono molte chiusure utilizzate per evitare perdite di spazio dei nomi e voglio sapere come posso seguire automaticamente queste definizioni.

Ho visto ternma non ci sono molti esempi su come configurarlo, quindi non sono stato in grado di fare molto.

Quali sono alcuni buoni strumenti per questo?


1
"... ma non ci sono molti esempi su come configurarlo ..." - Sotto l'intestazione "Documentazione" nella ternhome page si dice "Il manuale di riferimento dovrebbe essere la tua prima fermata per capire come usare Tern. " Almeno sono oO onesti
itsjeyd

Risposte:


8

Consiglierei assolutamente sterna. L'ho scoperto a metà del mio tirocinio (lavorando in Node.js) l'estate scorsa e ha funzionato meravigliosamente con company-modee js2-mode.

js2-modedi per sé è abbastanza potente. Può gestire il solito M-.salto in un file per la maggior parte del tempo e lo ternintegra perfettamente con il salto tra file / modulo (specialmente nell'ecosistema del nodo).

Il primo passo per usare tern è l'installazione del binario. Personalmente ho usato npm per farlo:

$ sudo npm install -g tern

Quindi installare in Emacs. La sezione pertinente della mia init.elè:

;;; tern
(package-require 'tern)
(add-hook 'js2-mode-hook (lambda () (tern-mode t)))

Il passaggio finale consiste nell'impostare un .tern-projectfile nella directory principale del progetto . Per i progetti Node.js, lo uso come punto di partenza:

{
    "loadEagerly": [
        "src/**.js"
    ],
    "plugins": {
        "node": {
        }
    }
}

Se lo usi company-mode, l'installazione company-ternè anche altamente consigliata:

(package-require 'company-tern)
(eval-after-load 'company
    '(add-to-list 'company-backends 'company-tern))

Come nota, ho avuto qualche problema con il server Sterna occasionalmente morendo l'estate scorsa (2014). Eseguendo il seguente risolto in modo coerente:

M-: (delete-process "Tern") RET

Non sono riuscito a capire esattamente cosa lo stesse causando, ma è successo raramente abbastanza per essere poco più di un fastidio.

Riferimenti:


Sembra quasi la configurazione che ho ottenuto. Il fatto è che quasi sempre mi viene richiesto di non trovare alcuna definizione . Ecco perché ho pensato che potesse esserci qualcosa di sbagliato nella mia configurazione. Ad esempio, in un file che ho app.eventBus = _({}).extend(Backbone.Events);e in un altro ho app.eventBus.trigger("changeURL","");. Ma quando lo faccio tern-find-definitionper quest'ultimo eventBusnon ottengo alcuna definizione trovata . C'è qualcosa che faccio di sbagliato, o semplicemente ternnon supporta il tipo di comportamento che immagino possa supportare?
caisah

Con alcuni framework di frontend presenta dei problemi. Quasi sempre non è stato in grado di capire cosa fare con Angular (anche se ho evitato i bit Angular e non ho cercato di capire come farlo funzionare con loro). Se i file non fanno riferimento a vicenda tramite chiamate in stile RequireJS, dovrai scavare di più. Sembra che qualcuno abbia funzionato (?) Ma non ho abbastanza esperienza per dirlo.
J David Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.