Je joue avec la bibliothèque react.js de Facebook. J'essaie d'utiliser leur syntaxe JSX qui décrit la création d'une vue de la manière suivante.
/** @jsx React.DOM */
var HelloMessage = React.createClass({
render: function() {
return <div>{'Hello ' + this.props.name}</div>;
}
});
React.renderComponent(<HelloMessage name="John" />, mountNode);
JSLint n'a évidemment pas aimé cela ("attendait un identifiant et a vu à la place '<';" - erreur de syntaxe JavaScript), alors comment contourner cela dans mon fichier .jshintrc?
(mise à jour: cet article date de 2013 et est désormais obsolète)
J'utilise JSHint + JSX.
Cela ne devrait pas nécessiter un fork de JSHint, il devrait y avoir un moyen de dire à JSHint de désactiver tous les avertissements pour un bloc de code. Malheureusement, il n'existe aucun moyen de désactiver tous les avertissements , uniquement un ensemble spécifique d'avertissements, donc je peux finir par soumettre une demande d'extraction pour l'ajouter, ou changer les linters. Mise à jour: Nous avons soumis une demande de pull qui a été acceptée .
Comme vous l'avez noté, le flux de travail utilisé par Facebook et Instagram consiste à se pelotonner en dehors de IDE à partir de la ligne de commande.
Votre autre option consiste à extraire tous vos modèles JSX dans leurs propres fichiers et à en faire une fonction de portée au lieu d'exister à l'intérieur d'une portée lexicale implicite. Nous l'avons essayé et n'avons pas aimé la quantité de passe-partout.
(Je ne suis pas affilié à l'équipe React)
J'ai essayé de suivre les conseils de Dustin's et STRML's sur ce fil, et voici ce qui a fonctionné le mieux pour moi.
J'utilise Sublime Text avec SublimeLinter + SublimeLinter-jshint + SublimeLinter-jsxhint .
Ce sont des plugins très agréables qui me permettent de voir des erreurs lorsque j'enregistre le fichier, les deux pour les fichiers JS et JSX:
Ces plugins respectent le .jshintrc
De votre projet et je ne saurais trop les recommander.
Assurez-vous de suivre les instructions d'installation des trois packages, sinon ils ne fonctionneront pas:
L'installation SublimeLinter est simple (instructions) ;
SublimeLinter-jshint a besoin d'un jshint
global dans votre système (instructions = );
SublimeLinter-jsxhint a besoin d'un global jsxhint
dans votre système, ainsi que JavaScript ( JSX) bundle à l'intérieur de Packages/JavaScript
(instructions).
Vous pouvez configurer le linter pour qu'il s'exécute toutes les quelques secondes, lors de l'enregistrement du fichier ou manuellement.
Nous utilisons JSHint dans le cadre de notre flux de travail Git et comme étape de génération pour appliquer les directives. Nous aurions pu utiliser jsxhint mais nous voulions continuer à utiliser grunt-contrib-jshint donc ce n'était pas une option.
En ce moment, nous exécutons une jshint
normale comme une étape de construction après la transformation react
, donc il traite simplement le fichiers JS de sortie.
Ce serait cool si quelqu'un bifurquait grunt-contrib-jshint et faisait une version qui fonctionne avec jsxhint
, mais cela ne me semble pas être une tâche facile. (Mise à jour: quelqu'un l'a fait juste mais je ne l'ai pas testé.)
Le compilateur JSX génère du code qui rompt certaines de nos conventions.
Je ne voulais pas utiliser ignore:start
Et ignore:end
comme suggéré par Dustin car cela désactiverait effectivement tout peluches à l'intérieur render
méthodes. C'est une mauvaise idée dans mon livre. Par exemple, l'exclusion de la méthode render
du linting fait penser à linter que je n'utilise pas certaines des bibliothèques et des composants enfants que je déclare avec require
en haut du fichier. Par conséquent, la nécessité d'ignorer les choses se propage de la méthode render
au reste du fichier, ce qui va complètement à l'encontre de l'objectif de ignore:start
.
Au lieu de cela, je décore explicitement chaque méthode render
avec trois options JSHint que le compilateur JSX rompt (actuellement) pour moi:
render: function () {
/* jshint trailing:false, quotmark:false, newcap:false */
}
C'est suffisant dans mon cas; pour votre .jshintrc
cela peut nécessiter un réglage.
JsxHint et JSHint ne sont pas les meilleurs outils pour linting JSX. JSHint ne prend pas en charge JSX et tout ce que JsxHint fait est de transformer JSX, puis d'exécuter JSHint sur le code transformé. J'ai utilisé (et je le recommande vivement) ESLint avec le plugin React . C'est mieux car Eslint peut analyser n'importe quelle saveur Javascript en utilisant des analyseurs personnalisés comme esprima-fb ou babel-eslint (voir la mise à jour ci-dessous).
Échantillon .eslintrc
fichier:
{
"parser": "esprima-fb",
"env": {
"browser": true,
"node": true
},
"rules": {
"no-mixed-requires": [0, false],
"quotes": [2, "single"],
"strict": [1, "never"],
"semi": [2, "always"],
"curly": 1,
"no-bitwise": 1,
"max-len": [1, 110, 4],
"vars-on-top": 0,
"guard-for-in": 1,
"react/display-name": 1,
"react/jsx-quotes": [2, "double", "avoid-escape"],
"react/jsx-no-undef": 2,
"react/jsx-sort-props": 0,
"react/jsx-uses-react": 1,
"react/jsx-uses-vars": 1,
"react/no-did-mount-set-state": 2,
"react/no-did-update-set-state": 2,
"react/no-multi-comp": 0,
"react/no-unknown-property": 1,
"react/prop-types": 2,
"react/react-in-jsx-scope": 1,
"react/self-closing-comp": 1,
"react/wrap-multilines": 2
},
"ecmaFeatures": {
"jsx": true
},
"plugins": [ "react" ],
"globals": {
"d3": true,
"require": "true",
"module": "true",
"$": "true",
"d3": "true"
}
}
[~ # ~] mise à jour [~ # ~]
esprima-fb sera bientôt déconseillé par Facebook. Utilisez babel-eslint comme analyseur pour eslint. Un bon endroit pour en savoir plus sur la façon dont vous pouvez configurer Babel & Eslint pour travailler avec React is ce projet Github .
Les gars qui maintiennent le repo sont incroyablement utiles. Il vous suffit de l'exécuter en lançant la transformation JSX pour produire du javascript valide à moins que quelqu'un ne crée un fork de jshint. S'il y a suffisamment d'intérêt, il pourrait être mis sur la feuille de route pour la future version du framework React. Peut regarder le fil de couverture ici .
J'utilise grunt + react-tools + jshint pour lint les fichiers .js construits à l'aide de react-tools. La sortie de react-tools est très bonne pour conserver votre espacement, votre indentation, etc., lors de la conversion de votre .jsx en .js, donc cela vous donne un fichier précis à comparer.
Pour configurer, installez grunt la manière normale . Installez ensuite grunt-contrib-watch, react-tools, grunt-react et grunt-contrib-jshint.
npm install grunt-contrib-watch react-tools grunt-react grunt-contrib-jshint --save-dev
voici un exemple de fichier grunt:
'use strict';
module.exports = function (grunt) {
// Project configuration
grunt.initConfig({
// Task configuration
jshint: {
options: {
jshintrc: true,
},
react: {
src: ['react/**/*.js']
}
},
react: {
files: {
expand: true,
cwd: 'react/',
src: ['**/*.jsx'],
dest: 'react/',
ext: '.js'
}
},
watch: {
jsx: {
files: ['react/**/*.jsx'],
tasks: ['react', 'jshint:react']
}
}
});
// These plugins provide necessary tasks
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-react');
// Default task
grunt.registerTask('default', ['react', 'jshint:react']);
};
Dans ce fichier, l'exécution de "grunt" compilera votre .jsx en .js, puis lint les fichiers .js. Vous pouvez exécuter "grunt watch" pour exécuter après chaque sauvegarde.
La plupart de mes paramètres .jshintrc habituels fonctionnent lors de l'exécution de cette façon. J'ai rencontré quelques problèmes au départ, mais la plupart ont été résolus en apportant des modifications à vos fichiers .jsx. Par exemple, j'ai "newcap" défini sur true. Lorsque j'ai suivi la convention de nommage React tutorial et mis en majuscule la première lettre des balises, cela a généré une erreur de peluche. Il a été corrigé en mettant en minuscule la première lettre des étiquettes.
J'ai dû mettre "trailing": false dans mon .jshintrc. Les fichiers .js résultants ont des espaces blancs à la fin où il convertit les balises en Javascript. Je n'ai pas compris s'il existe une configuration de React-Tools pour changer cela. Vous pouvez utiliser la méthode décrite dans le post de Dan si vous ne souhaitez pas modifier votre .jshintrc.
Outre le peluchage, ce processus permet également de détecter les problèmes liés à votre conversion .jsx en .js.
Le problème/la chute de ce processus est que vous ne pouvez pas lint de fichiers .jsx dans l'éditeur. Mais garder une fenêtre de terminal ouverte que vous pouvez voir pendant la modification est un remplacement utile. Uing TMUX avec Vim et Grunt dans différents volets est ma façon préférée d'utiliser cela.
La réponse d'Amey est correcte mais pourrait également être mise à jour aujourd'hui:
Paire de eslint et eslint-plugin-react supporte maintenant es6 + jsx + react donc babel-eslint n'est nécessaire que si vous utilisez des trucs spécifiques comme les propriétés de classe, les décorateurs, les types asynchrones/attendent.
Exemple . Eslintrc configuration pour react + jsx + es6 sans babel-eslint:
{
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"rules": {
"semi": 0
},
"plugins": [
"react"
],
"extends": ["eslint:recommended", "plugin:react/recommended"]
}
Vous pouvez simplement regarder eslint-plugin-react instructions pour plus de détails/informations.