Como navegar em um projeto JavaScript?

9

Atualmente, estou trabalhando em um projeto JavaScript usando o Backbone.js e me pergunto como posso navegar entre arquivos, com base nas definições de método e objeto.

Por exemplo, eu manter referências a alguns dos meus pontos de vista do objeto global App.Views, e eu gostaria de ser capaz de navegar para cada definição de indivíduo ( App.Views.Home, App.Views.SomePage, etc.) se eu encontrar um. Além disso, existem muitos fechamentos usados ​​para evitar vazamento de espaço para nome, e quero saber como posso seguir automaticamente essas definições.

Eu já vi, ternmas não há muitos exemplos de como configurá-lo, portanto não pude fazer muito.

Quais são algumas boas ferramentas para isso?

caisah
fonte
1
"... mas não há muitos exemplos de como configurá-lo ..." - No cabeçalho "Documentação" na ternpágina inicial, ele diz "O manual de referência deve ser sua primeira parada para descobrir como usar o Tern. " Pelo menos eles são honestos oO
itsjeyd 4/14

Respostas:

8

Eu recomendaria absolutamente tern. Eu o descobri na metade do meu estágio (trabalhando no Node.js) no último verão e funcionou maravilhosamente com company-modee js2-mode.

js2-modepor si só é bastante poderoso. Ele pode lidar com o M-.salto usual em um arquivo na maioria das vezes e terncomplementa-o muito bem com o salto entre arquivos / módulo (especialmente no ecossistema de nós).

O primeiro passo para usar o tern é instalar o binário. Eu pessoalmente usei o npm para fazer isso:

$ sudo npm install -g tern

Em seguida, instale no Emacs. A seção relevante do meu init.elé:

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

A etapa final é configurar um .tern-projectarquivo no diretório raiz do seu projeto . Para projetos Node.js, eu uso isso como ponto de partida:

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

Se você usar company-mode, a instalação company-terntambém é altamente recomendada:

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

Como nota, tive alguns problemas com o servidor andorinha-do-mar que morre ocasionalmente no verão passado (2014). A execução do seguinte corrigiu-o consistentemente:

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

Eu não era capaz de descobrir exatamente o que estava causando isso, mas acontecia com pouca frequência para ser pouco mais que um incômodo.

Referências:

J David Smith
fonte
Isso se parece muito com a configuração que recebi. O problema é que quase sempre sou solicitado com Nenhuma definição encontrada . É por isso que pensei que poderia haver algo errado com minha configuração. Por exemplo, em um arquivo que eu tenho app.eventBus = _({}).extend(Backbone.Events);e em outro que eu tenho app.eventBus.trigger("changeURL","");. Mas quando eu faço o tern-find-definitionmeu último eventBus, recebo Nenhuma definição encontrada . Existe algo que eu faço de errado ou simplesmente ternnão está apoiando o tipo de comportamento que eu imagino que apoiaria?
caisah
Em algumas estruturas de front-end, há problemas. Quase sempre era incapaz de descobrir o que fazer com o Angular (embora eu evitasse os bits do Angular e não tentasse descobrir como fazê-lo funcionar com eles). Se os arquivos não se referenciarem por meio de chamadas no estilo RequireJS, será necessário fazer mais escavações. Parece que alguém conseguiu funcionar (?), Mas não tenho experiência suficiente com isso para contar.
J David Smith