Aktualnie konfiguruję skrypt automatycznej kompilacji (z gruntjs) dla projektu opartego na require.js. Dlatego chciałbym uruchomić jslint/jshint na wszystkich wymaganych plikach przed konkatenacją i zminimalizowaniem go r.js. Ponieważ folder js zawiera wiele plików programistycznych, których nie chcę lintować, nie mogę po prostu przekazać js/**/*.js
do JSLint. Moja pierwsza myśl polegała na uruchomieniu r.js z optimizer: 'none'
, zlepieniu połączonego pliku, a następnie zminimalizowaniu go, ale nie jest to opcja z dwóch powodów. Najpierw będzie zawierał biblioteki dostawców, których nie chcę lintować, a drugi znaleźć linię z błędem, znaleźć klasę, znaleźć odpowiedni plik js w folderze dev, naprawić go, ponownie uruchomić r.js i na koniec spleść znowu jest sposobem na wiele kłopotów dla naszego przepływu pracy. Tak więc szukam możliwości podpięcia linting do procesu optymalizatora r.js lub przynajmniej uzyskać listę drzewa zależności requirejs w jakiś sposób, że mogę parsować i przekazać go do lint. Lub jakiekolwiek rozwiązanie praktyczne do zautomatyzowanego procesu, wymyślisz.Korzystanie z narzędzia JSLint/Hint z wymagającymi programami roboczymi
Odpowiedz
Ta odpowiedź rodzaju omija Grunt, ale to powinno działać na to, co chcesz zrobić. Sposób, w jaki bym to zrobił, to spojrzenie na r.js i próba nadpisania funkcji, która odbiera ścieżkę do różnych ładowanych modułów, przechwycenie nazwy modułu i wklejenie plików podczas ładowania r.js i kompilowanie modułów. Zrobiłem to tak:
var requirejs = require('requirejs');
var options = {/*r.js options as JSON*/};
var oldNewContext = requirejs.s.newContext;
requirejs.s.newContext = function(){
var context = oldNewContext.apply(this, arguments);
var oldLoad = context.Module.prototype.load;
context.Module.prototype.load = function(){
var module = oldLoad.apply(this, arguments);
if(/\.js$/.test(this.map.url) && !/^empty:/.test(this.map.url))
console.log(this.map.url);
return module;
}
return context;
}
requirejs.optimize(options)
Następnie po uruchomieniu requirejs.optimize na modułach, należy uzyskać wszystkie niepuste adresy URL JavaScript zalogowany do konsoli. Zamiast logować je do konsoli, można użyć adresów URL do zindeksowania plików.
Myślę, że właśnie tego szukałem, przetestuję to jutro. –
Lint pierwszy, skompiluj później. Po prostu bądź konkretny o plikach, które chcesz spleść i użyj! Przedrostek zignorować konkretne pliki:
grunt.initConfig({
lint: {
// Specify which files to lint and which to ignore
all: ['js/src/*.js', '!js/src/notthisfile.js']
},
requirejs: {
compile: {
options: {
baseUrl: 'js/src',
name: 'project',
out: 'js/scripts.js'
}
}
}
});
// Load the grunt-contrib-requirejs module.
// Do `npm install grunt-contrib-requirejs` first
grunt.loadNpmTasks('grunt-contrib-requirejs');
// Our default task (just running grunt) will
// lint first then compile
grunt.registerTask('default', ['lint', 'requirejs']);
To zdecydowanie dobre podejście, ale IMHO bardzo powtarzalne, ponieważ musisz utrzymywać dwa pliki (main.js i grunt) i właśnie tego staram się unikać. ... jakkolwiek dziękuję za odpowiedź. –
wolę nie przesłanianie metod r.js, albo można utworzyć niechcianą zależność od konkretnej wersji (musisz zaktualizować swój kod powinien r.js zmiany)
Jest to kod używam dla w tym samym celu, wykorzystując funkcję require na onBuildRead oraz fakt, że obiekty w javascriptu są przekazywane przez odniesienie. Upewniam się, że najpierw uruchamiam wymaganą kompilację, a następnie podświetlam źródła plików js.
Wadą jest to, że będziesz lint po zakończeniu kompilacji. Dla mojej konfiguracji to nie problem.
module.exports = function(grunt) {
var jsHintOptions = {
options: {
curly: true,
eqeqeq: true,
eqnull: true,
browser: true,
globals: {
jQuery: true
}
},
all: [] // <--- note this is empty! We'll fill it up as we read require dependencies
};
var requirejsOptions = {
compile: {
options: {
paths: {
"jquery": "empty:"
},
baseUrl: "./",
name: "src/mypackage/main",
mainConfigFile: "src/mypackage/main.js",
out: 'build/mypackage/main.js',
onBuildRead: function (moduleName, path, contents) {
jsHintOptions.all.push(path); // <-- here we populate the jshint path array
return contents;
}
}
}
};
grunt.initConfig({
pkg: grunt.file.readJSON('packages/mypackage.package.json'),
requirejs: requirejsOptions,
jshint: jsHintOptions
});
// load plugin that enabled requirejs
grunt.loadNpmTasks('grunt-contrib-requirejs');
// load code quality tool
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.registerTask('default', ['requirejs', 'jshint']); // <-- make sure your run jshint AFTER require
};
Zamiast zadanie lint
, zainstalować obciążenia i skonfigurować grunt-contrib-jshint. Ma opcję ignores
ignorowania określonych plików lub ścieżek plików.
Oto moje zadanie:
jshint: {
options: {
// options here to override JSHint defaults
boss : true, // Suppress warnings about assignments where comparisons are expected
browser : true, // Define globals exposed by modern browsers (`document`, `navigator`)
curly : false, // Require curly braces around blocks
devel : false, // Define `console`, `alert`, etc. (poor-man's debugging)
eqeqeq : false, // Prohibit the use of `==` and `!=` in favor of `===` and `!==`
"-W041" : false, // Prohibit use of `== ''` comparisons
eqnull : true, // Suppress warnings about `== null` comparisons
immed : true, // Prohibit the use of immediate function invocations w/o wrapping in parentheses
latedef : true, // Prohibit the use of a var before it's defined
laxbreak: true, // Suppress warnings about possibly unsafe line breaks
newcap : true, // Require you to capitalize names of constructor functions
noarg : true, // Prohibit the use of `arguments.caller` and `arguments.callee`
shadow : true, // Suppress warnings about var shadowing (declaring a var that's declared somewhere in outer scope)
sub : true, // Suppress warnings about using `[]` notation, e.g. `person['name']` vs. `person.name`
trailing: true, // Trailing whitespace = error
undef : false, // Prohibit the use of explicitly undeclared variables
unused : false, // Warn when you define and never use your variables
white : false, // Check JS against Douglas Crawford's coding style
jquery : true, // Define globals exposed by jQuery
// Define global functions/libraries/etc.
globals : {
amplify : true
},
ignores: [
'src/app/templates/template.js',
'src/scripts/plugins/text.min.js'
]
},
gruntfile: {
src: 'Gruntfile.js'
},
app: {
src: 'src/app/**/*.js'
},
scripts: {
src: 'src/scripts/**/*.js'
}
}
Coś https://github.com/jshint/jshint#ignoring-files-and-directories? –