最近开始弄hubot,顺带也开始学习 javascript ,首先从单独一个 nodejs 项目开始:

nvm 和 node 的安装使用在前面已经说过了: Nodejs多版本的安装与管理

新建一个项目目录,build01

然后在其下建立如下目录结构:

mkdir build01

cd build01
mkdir es6 dist

mkdir public
cd public
mkdir es6 dist 

image-20220104160358593

解释一下,es6 下放的是服务器端的源代码,dist 下放的是服务器端处理过的源代码。

public/es6 放的是浏览器端的源代码,public/dist 放的是浏览器端处理过的源代码。

一、安装gulp和babel

babel 是用来做 js 格式转换的,注意,原有的 babel-preset-es2015 已经不适用了。

npm install --save-dev gulp gulp-babel babel-preset-env@next

生成一个.babelrc 文件,内容就一行

{ "presets": ["env"] }

在 es6 目录下,建立一个测试的 test.js 文件,内容如下:

'use strict';

const sentences = [
  { subject: 'JavaScript', verb: 'is',  object: 'great' },
  { subject: 'Elephants',  verb: 'are', object: 'large' },
];

function say({ subject, verb, object }) {
  console.log(`${subject} ${verb} ${object}`);
}

for ( let s of sentences) {
  say(s);
}

仔细看,上面这个文件用到了 es6 的语法,对象的解构,of语法。

我们来用 babel 把它转换一下,变成 es5 的语法

在build01目录下,生成gulpfile.js,内容如下:

const gulp = require('gulp');
const babel = require('gulp-babel');


gulp.task('default', done =>{

  gulp.src("es6/**/*.js")
  .pipe(babel())
  .pipe(gulp.dest("dist"));

  gulp.src("public/es6/**/*.js")
  .pipe(babel())
  .pipe(gulp.dest("public/dist"));

  done();
   
});

注意上面,**表示洞穿所有子目录。运行 gulp ,就会在 dist 目录下生成新的 test.js ,内容如下:

'use strict';

var sentences = [{
  subject: 'JavaScript',
  verb: 'is',
  object: 'great'
}, {
  subject: 'Elephants',
  verb: 'are',
  object: 'large'
}];

function say(_ref) {
  var subject = _ref.subject,
      verb = _ref.verb,
      object = _ref.object;
  console.log("".concat(subject, " ").concat(verb, " ").concat(object));
}

for (var _i = 0; _i < sentences.length; _i++) {
  var s = sentences[_i];
  say(s);
}

仔细看,es6 的语法 变成 es5 的语法了。

二、安装eslint

babel 是对语法进行转换,那么 eslint 就是对语法作出规范,很多人吃 airbnb 那一套规则。

npm install --save-dev eslint gulp-eslint gulp-if

安装完成后执行命令进行初始化:

eslint --init

会提问一堆问题:

How would you like to use ESLint? … 
▸ To check syntax, find problems, and enforce code style
  
What type of modules does your project use? … 
▸ JavaScript modules (import/export)  

Which framework does your project use? … 
  React
  Vue.js
▸ None of these

Does your project use TypeScript? ‣ No / Yes

#两个都选哦
Where does your code run? …  (Press <space> to select, <a> to toggle all, <i> to invert selection)
✔ Browser
✔ Node

How would you like to define a style for your project? … 
▸ Answer questions about your style

✔ What format do you want your config file to be in? · JSON
✔ What style of indentation do you use? · 4
✔ What quotes do you use for strings? · single
✔ What line endings do you use? · unix
✔ Do you require semicolons? · Yes

最后得到文件 .eslintrc.json

{
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaVersion": 13,
        "sourceType": "module"
    },
    "rules": {
        "indent": [
            "error",
            4
        ],
        "linebreak-style": [
            "error",
            "unix"
        ],
        "quotes": [
            "error",
            "single"
        ],
        "semi": [
            "error",
            "always"
        ]
    }
}

这里注意,要改两个地方:

"es2021": true,
改成
"es6": true,

"ecmaVersion": 13,
改成
"ecmaVersion": 10,

然后我们改写一下 gulpfile.js,增加 eslint 的部分

const gulp = require('gulp');
const babel = require('gulp-babel');
const eslint = require('gulp-eslint');
const gulpIf = require('gulp-if');

function isFixed(file) {
  return file.eslint !== null && file.eslint.fixed;
}

gulp.task('default', done =>{

  gulp.src(["es6/**/*.js", "public/**/*.js"])
  .pipe(eslint({fix: true}))
  .pipe(eslint.format())
  .pipe(gulpIf(isFixed, gulp.dest(file => file.base)))
  .pipe(eslint.failAfterError());


  gulp.src("es6/**/*.js")
  .pipe(babel())
  .pipe(gulp.dest("dist"));

  gulp.src("public/es6/**/*.js")
  .pipe(babel())
  .pipe(gulp.dest("public/dist"));

  done();
   
});

再运行 gulp ,会把 es6/test.js 给格式化好,对比一下原文件就知道了,ident 被调整成4个空格了:

'use strict';

const sentences = [
    { subject: 'JavaScript', verb: 'is',  object: 'great' },
    { subject: 'Elephants',  verb: 'are', object: 'large' },
];

function say({ subject, verb, object }) {
    console.log(`${subject} ${verb} ${object}`);
}

for ( let s of sentences) {
    say(s);
}