Usando JSLint / Hint com requirejs

9

Atualmente, estou configurando um script de criação automatizado (com ) para um projeto dirigido por . Portanto, gostaria de executar / em todos os arquivos necessários antes de concatenar e reduzi-lo com r.js. Como a pasta js contém muitos arquivos de desenvolvimento que eu não quero fiapos, não posso simplesmente passar js/**/*.js para JSLint. Meu primeiro pensamento foi executar o r.js com optimizer: 'none' , remover o arquivo concatenado e depois minimizá-lo, mas isso não é uma opção por dois motivos. Primeiro ele incluirá libs do fornecedor Eu não quero fiapos e segundos encontrando a linha com o erro, localizo sua classe, localizo o arquivo js apropriado na pasta dev, corrijo-o lá, executo r.js novamente e finalmente lint ele novamente, é muito trabalho para o nosso fluxo de trabalho. Então, estou procurando uma possibilidade de ligar o linting no processo do r.js optimizer ou, pelo menos, obter uma lista da árvore de dependências requirejs de alguma forma, que eu possa analisar e passar para a lint. Ou qualquer solução praticável para um processo automatizado, você descobrirá.

    
por Marcello di Simone 17.10.2012 в 16:50
fonte

4 respostas

1

Esta resposta meio que contorna o Grunt, mas deve funcionar para o que você quer fazer. A maneira que eu faria isso é olhar para r.js e tentar substituir uma função que recebe o caminho para os vários módulos que estão sendo carregados, interceptar o nome do módulo e remover os arquivos enquanto o r.js está carregando e compilando os módulos. Eu fiz assim:

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)

Então, quando você executar requirejs.optimize em seus módulos, deverá obter todos os URLs JavaScript não vazios registrados no console. Em vez de registrá-los no console, você poderia usar as URLs para remover os arquivos.

    
por Ryan Lynch 17.10.2012 / 19:20
fonte
2

Lint primeiro, compile depois. Basta ser específico sobre os arquivos que você deseja remover e usar o! prefixo para ignorar arquivos específicos:

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']);
    
por Kyle Robinson Young 17.10.2012 / 19:16
fonte
2

Eu prefiro não sobrescrever os métodos do r.js, ou você pode criar uma dependência indesejada em uma versão específica (você precisará atualizar seu código se r.js mudar)

Este é o código que eu uso para o mesmo propósito, fazendo uso da função onBuildRead do require e do fato de que objetos em javascript são passados por referência. Eu me certifico de executar primeiro a compilação require, depois lint as fontes do arquivo js.

A desvantagem é que você vai lint após a compilação completa. Para minha configuração, isso não é um problema.

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
};
    
por malukisses 08.03.2013 / 21:54
fonte
0

Em vez de usar a tarefa lint , instale, carregue e configure o grunt-contrib-jshint . Ele tem uma opção ignores para ignorar arquivos específicos ou padrões de caminho de arquivo.

Aqui está minha tarefa:

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'
    }
}
    
por jeffbyrnes 19.06.2013 / 20:46
fonte