2012-08-14 11 views
8

Chcę oddzielić logikę aplikacji na wiele plików JavaScript dla zachowania zdrowia i przyjazności dla programistów, przechowywanych w folderze/src. Pliki te powinny być lintowane i łączone w /dist/app.js podczas procesu kompilacji. Używam gruntu do mojego procesu tworzenia, ponieważ ma on już poręczne zadania związane z lintami i konkatencjami.Jak rozwiązywać zależności podczas lintowania pojedynczych plików javascript z pomrukaniem?

 

    + 
    |- grunt.js 
    |- readme 
    |-vendors 
     |-backbone.js 
    |- src 
     |- core.js 
     |- user.js 
    |- dist 
     |-app.js 

Wpadam w irytujący problem. Używam backbone.js do struktury aplikacji, a większość moich plików źródłowych rozpoczyna się od zdefiniowania modeli przez rozszerzenie Backbone.Model. Linting tych plików, JSHint narzeka, że ​​Backbone nie jest zdefiniowany i słusznie - szkielet rezyduje na zewnątrz w swoim własnym katalogu. Uwzględnienie wszystkich niezbędnych skryptów w odpowiedniej kolejności jest czymś, co zakładam, że jest zrobione w html. Każdy pojedynczy plik źródłowy powinien wiedzieć tylko o sobie.

wiem, że mogę powstrzymać te niezdefiniowanych ostrzeżenia przez ustawienie Lint za undef flagę w grunt.js do fałszywego ale chcę zachować to ustawienie prawdziwej, aby ostrzec innych niezdefiniowanych zmiennych w mojej aplikacji, ponieważ jest to wspólny wskaźnik literówek. Czy jest jakiś czysty sposób, aby powiedzieć, chrząknięcie (lub lint), jakie pliki umieścić przed linting je? Czy robię coś nie tak z moim procesem kompilacji lub z moją architekturą aplikacji? Czy jest to po prostu coś, z czym muszę żyć?

Odpowiedz

11

W jshint opcje pozwalają określić listę globalnych, które pochodzą z innych bibliotek używasz w pliku grunt.js:



    jshint: { 
     options: { 
     curly: true, 
     eqeqeq: true, 
     immed: false, 
     latedef: true, 
     newcap: true, 
     noarg: true, 
     sub: true, 
     undef: true, 
     boss: true, 
     eqnull: true, 
     browser: true 
     }, 

     globals: { 
     jQuery: true, 
     Backbone: true, 
     _: true 
     } 
    }, 

uwaga ustawienie globals na dole. Dzięki temu JSHint może zignorować te zmienne, ale nadal uruchamia ustawienia undef: true (jak pokazano powyżej).

+0

Perfect! Dzięki! Byłem prawie pewien, że musi to być łatwy sposób, ale dokumentacja gruntu nie była zbyt jasna i nie miałem wcześniejszego doświadczenia z JSHintem. Dzięki jeszcze raz! – timkg

+2

Dodanie czegoś w rodzaju 'core.js' do przykładu' globals' w odpowiedzi pomogłoby w zrozumieniu. Pochodzę z perspektywy Web Storm zastanawiając się, jak dodać elementy zdefiniowane w mojej własnej bibliotece, zanim zorientowałem się, że mogę dodać je do pliku. Może również wspomnieć o tym, że możesz dodać opcje do pojedynczego pliku z kluczem globalnym '/ *: wartość, .. * /' składnia – Snekse

+2

Ciągle otrzymuję "" foo "nie jest zdefiniowane" dopóki nie przeniosłem globów obiekt wewnątrz obiektu opcji. –

0

Alternatywnym podejściem (które nie opierają się na grunt) jest dodanie komentarza jshint w plikach JS:

/* global Backbone, jQuery, _ */ 
+1

A jeśli twój skrypt wymaga przypisania wartości do globalnej, dodaj po niej wyrażenie ': true' (bez spacji). Na przykład '/ * global Backbone, jQuery: true, _ * /' –