¿Cómo navegar por un proyecto de JavaScript?

9

Actualmente estoy trabajando en un proyecto de JavaScript con Backbone.js y me pregunto cómo puedo navegar entre archivos, según las definiciones de métodos y objetos.

Por ejemplo, sigo referencias a algunos de mis puntos de vista en el objeto global App.Views, y me gustaría ser capaz de navegar a cada definición individual ( App.Views.Home, App.Views.SomePage, etc.) si encuentro uno. Además, se utilizan muchos cierres para evitar fugas de espacio de nombres, y quiero saber cómo puedo seguir automáticamente estas definiciones.

Lo he visto ternpero no hay muchos ejemplos sobre cómo configurarlo, por lo que no he podido hacer mucho.

¿Cuáles son algunas buenas herramientas para esto?

caisah
fuente
1
"... pero no hay muchos ejemplos sobre cómo configurarlo ..." - Bajo el encabezado "Documentación" en la ternpágina de inicio dice "El manual de referencia debería ser su primera parada para descubrir cómo usar Tern. " Al menos son honestos oO
itsjeyd

Respuestas:

8

Absolutamente recomendaría tern. Lo descubrí a mitad de mi pasantía (trabajando en Node.js) el verano pasado, y funcionó maravillosamente con company-modey js2-mode.

js2-modePor sí mismo es bastante poderoso. Puede manejar el M-.salto habitual dentro de un archivo la mayor parte del tiempo, y lo terncomplementa muy bien con el salto entre archivos / módulos (especialmente en el ecosistema de nodos).

El primer paso para usar tern es instalar el binario. Yo personalmente usé npm para hacerlo:

$ sudo npm install -g tern

Luego instale en Emacs. La sección relevante de mi init.eles:

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

El paso final es configurar un .tern-projectarchivo en el directorio raíz de su proyecto . Para los proyectos de Node.js, uso esto como punto de partida:

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

Si lo usa company-mode, la instalación company-terntambién es muy recomendable:

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

Como nota, tuve algunos problemas con el servidor tern muriendo ocasionalmente el verano pasado (2014). Ejecutar lo siguiente lo solucionó constantemente:

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

No pude averiguar exactamente qué lo estaba causando, pero sucedió con poca frecuencia como para ser poco más que una molestia.

Referencias

J David Smith
fuente
Esto se parece bastante a la configuración que obtuve. La cuestión es que casi siempre se me solicita sin encontrar ninguna definición . Es por eso que pensé que podría haber algo mal con mi configuración. Por ejemplo, en un archivo que tengo app.eventBus = _({}).extend(Backbone.Events);y en otro que tengo app.eventBus.trigger("changeURL","");. Pero cuando lo hago tern-find-definitionpara mi último eventBus, no se encuentra ninguna definición . ¿Hay algo que hago mal, o simplemente ternno es compatible con el tipo de comportamiento que imagino?
caisah
Con algunos marcos frontend tiene problemas. Casi siempre era incapaz de averiguar qué hacer con Angular (aunque evité los bits angulares y no traté de averiguar cómo hacer que funcione con ellos). Si los archivos no hacen referencia entre sí a través de llamadas de estilo RequireJS, entonces tendrá que cavar más. Parece que alguien lo hizo funcionar (?) Pero no tengo suficiente experiencia con eso para contarlo.
J David Smith