2012-10-17 52 views
9

我目前正在爲一個驅動項目設置自動生成腳本(使用)。因此,我想在使用r.js連接和縮小它之前對所有必需的文件運行/。由於js文件夾包含很多我不想要的皮膚,我不能只將js/**/*.js傳遞給JSLint。我的第一個想法是使用optimizer: 'none'運行r.js,將連接的文件刪除,然後縮小它,但由於兩個原因,這不是一個選項。首先,它將包括我不想要的lint供應商庫,然後找到錯誤行,找到它的類,在dev文件夾中找到合適的js文件,在那裏修復它,再次運行r.js並最終將它擦掉再次,是我們的工作流程的麻煩。所以我正在尋找一種可能性,將linting連接到r.js優化器進程中,或者至少以某種方式獲取requirejs依賴關係樹列表,以便我可以解析並將它傳遞給lint。或者任何可用於自動化過程的解決方案,您都會想到。在requirejs中使用JSLint /提示

+0

喜歡的東西https://github.com/jshint/jshint#ignoring-files-and-directories? –

回答

1

此答案類似於繞過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來欺騙文件。

+0

我想這正是我正在尋找的,明天會去測試它。 –

2

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']); 
+0

這絕對是一個很好的方法,但恕我直言很重複,因爲你必須保持兩個文件(main.js和grunt),這正是我試圖避免的。 ...如何永遠謝謝你的答案。 –

2

我不想重寫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 
}; 
0

,而不是使用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' 
    } 
}