我目前正在爲一個require.js驅動項目設置自動生成腳本(使用gruntjs)。因此,我想在使用r.js連接和縮小它之前對所有必需的文件運行jslint/jshint。由於js文件夾包含很多我不想要的皮膚,我不能只將js/**/*.js
傳遞給JSLint。我的第一個想法是使用optimizer: 'none'
運行r.js,將連接的文件刪除,然後縮小它,但由於兩個原因,這不是一個選項。首先,它將包括我不想要的lint供應商庫,然後找到錯誤行,找到它的類,在dev文件夾中找到合適的js文件,在那裏修復它,再次運行r.js並最終將它擦掉再次,是我們的工作流程的麻煩。所以我正在尋找一種可能性,將linting連接到r.js優化器進程中,或者至少以某種方式獲取requirejs依賴關係樹列表,以便我可以解析並將它傳遞給lint。或者任何可用於自動化過程的解決方案,您都會想到。在requirejs中使用JSLint /提示
回答
此答案類似於繞過Grunt,但它應該適用於您想要執行的操作。我會這樣做的方式是看看r.js並嘗試覆蓋一個函數,該函數接收正在加載的各個模塊的路徑,截取模塊名稱,並在r.js加載和編譯模塊時將lint文件。我已經做到了,像這樣:
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)
然後,當你在你的模塊requirejs.optimize運行,你應該得到所有登錄到控制檯的非空的JavaScript的URL。而不是將它們記錄到控制檯,您可以使用URL來欺騙文件。
我想這正是我正在尋找的,明天會去測試它。 –
Lint首先,稍後編譯。只是要具體說明你想要的皮毛和使用!前綴以忽略特定文件:
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']);
這絕對是一個很好的方法,但恕我直言很重複,因爲你必須保持兩個文件(main.js和grunt),這正是我試圖避免的。 ...如何永遠謝謝你的答案。 –
我不想重寫r.js的方法,或者您可以創建一個特定版本的不必要的依賴(你需要更新你的代碼應該r.js變化)
這是我使用的代碼同樣的目的,利用require的onBuildRead函數以及javascript中的對象通過引用傳遞的事實。我確定我先運行require build,然後用lint js文件源。
不足之處在於在構建完成之後您會掉毛。對於我的設置,這不是一個問題。
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
};
,而不是使用lint
任務,安裝,加載,併成立了grunt-contrib-jshint的。它有一個ignores
選項可以忽略特定的文件或文件路徑模式。
這是我的任務:
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'
}
}
- 1. 在Java/GWT中使用JSLint
- 2. 從命令提示符運行JSLint
- 3. 在vim + jslint中使用quickfix窗口
- 4. 在Wordpress中使用requireJS
- 5. 提示爲JavaScript應用程序遷移到使用AMD(如requirejs)
- 6. 在requireJS中使用document.ready
- 7. 在RequireJS中使用「shim」
- 8. 在支架中對JSLint使用.brackets.json
- 9. 在RequireJS中使用Openlayers 3和proj4js
- 10. 用requirejs顯式提供jquery
- 11. 在oracle中使用提示
- 12. 如何在RequireJS中使用Bing Maps API?
- 13. requirejs - 在非SPA網站中的使用
- 14. 如何在RequireJS中使用Magento2?
- 15. Karma/jasmine/pact-js使用requirejs的示例
- 16. 使用JSLint驗證removeEventListener
- 17. 推薦使用jslint配置?
- 18. JSLint,當使用JS框架
- 19. 如何在RequireJS中使用NodeJS包?
- 20. 使用與requirejs
- 21. 當使用requirejs
- 22. Angularjs無法使用RequireJs加載AngularJs使用RequireJs加載無法使用RequireJs
- 23. 在node.js中使用RequireJS插件amdefine
- 24. 使用backboneJS + requireJS +在PhoneGap的
- 25. RequireJS並在模塊中使用this.id?
- 26. 在requirejs和jquery中使用同位素
- 27. JsTestDriver在intellij中使用requirejs時斷言
- 28. 在主幹和RequireJS中使用listenTo
- 29. 在小書籤中使用RequireJS
- 30. 如何在requirejs中使用jquery.validate?
喜歡的東西https://github.com/jshint/jshint#ignoring-files-and-directories? –