0%

使用 ES6 写 Koa Web 项目

我们 node.js 只是实现了部分 ES6 的语法,所以为了让我们 ES6 的代码能 100% 在 node.js 下执行,必须使用我们的 babel 把 ES6 代码编译成 nodejs 可执行的代码。

  • node 环境:v12.13.1

开发环境搭建

首先,我们建立一个文件 my_koa

1
mkdir my_koa && cd my_koa
2
npm init -y

在我们的 my_koa 文件夹下就会产生一个 package.json 文件使我们的包配置文件,内容如下:

1
{
2
  "name": "my_koa",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "test": "echo \"Error: no test specified\" && exit 1"
8
  },
9
  "keywords": [],
10
  "author": "Neilyoz",
11
  "license": "ISC"
12
}

然后安装我们的依赖

1
npm i --save-dev @babel/cli @babel/core @babel/node @babel/preset-env @babel/register eslint

安装完成后 package.json 如下:

1
{
2
  "name": "my_koa",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "test": "echo \"Error: no test specified\" && exit 1"
8
  },
9
  "keywords": [],
10
  "author": "Neilyoz",
11
  "license": "ISC",
12
  "devDependencies": {
13
    "@babel/cli": "^7.7.4",
14
    "@babel/core": "^7.7.4",
15
    "@babel/node": "^7.7.4",
16
    "@babel/preset-env": "^7.7.4",
17
    "@babel/register": "^7.7.4",
18
    "eslint": "^6.7.1"
19
  }
20
}

我的习惯是将代码放到 my_koa\src 目录下进行管理,所以执行以下命令创建

1
mkdir src
2
touch index.js

归功于 npm 包管理的便利性,到这里已经成功了一半了。接下来就是要安装我们的主角 koa

1
npm i koa koa-router

npm 完成安装后,此时我们的 package.json 如下:

1
{
2
  "name": "my_koa",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "test": "echo \"Error: no test specified\" && exit 1"
8
  },
9
  "keywords": [],
10
  "author": "Neilyoz",
11
  "license": "ISC",
12
  "devDependencies": {
13
    "@babel/cli": "^7.7.4",
14
    "@babel/core": "^7.7.4",
15
    "@babel/node": "^7.7.4",
16
    "@babel/preset-env": "^7.7.4",
17
    "@babel/register": "^7.7.4",
18
    "eslint": "^6.7.1"
19
  },
20
  "dependencies": {
21
    "koa": "^2.11.0",
22
    "koa-router": "^7.4.0"
23
  }
24
}

到这里我们需要的基础包就已经安装完成了。可以开始我们的编码部分。

打开 src/index.js 文件输入一下内容:

1
import Koa from "koa";
2
import KoaRouter from "koa-router";
3
4
const app = new Koa();
5
const router = new KoaRouter();
6
7
router.get("/", async ctx => {
8
  ctx.body = "Index";
9
});
10
11
app.use(router.routes()).use(router.allowedMethods());
12
13
app.listen(3000);

直接运行 node ./src/index.js ,我们会看到是报错的。因为这里的编码并没有编译成为 nodejs 认识的形式。

一般我们开发环境可以直接使用 babel-node ./src/index.js 来运行代码,因为有安装 @babel/node 为了方便,我一般会在 package.json 中定义一个命令来直接运行,代码如下:

1
{
2
  "name": "my_koa",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "dev": "babel-node ./src/index.js"
8
  },
9
  "keywords": [],
10
  "author": "Neilyoz",
11
  "license": "ISC",
12
  "devDependencies": {
13
    "@babel/cli": "^7.7.4",
14
    "@babel/core": "^7.7.4",
15
    "@babel/node": "^7.7.4",
16
    "@babel/preset-env": "^7.7.4",
17
    "@babel/register": "^7.7.4",
18
    "eslint": "^6.7.1"
19
  },
20
  "dependencies": {
21
    "koa": "^2.11.0",
22
    "koa-router": "^7.4.0"
23
  }
24
}

要执行代码的时候只需要

1
npm run dev

可是开发环境修改完代码,总是要运行命令重新加载代码。那么怎么才能让代码保存,程序自动加载代码呢?

我使用 nodemon 来实现,首先我们要全局安装 nodemon

1
npm i -g nodemon

并且在 my_koa 的根目录下创建 nodemon.json 文件来保存 nodemon 运行需要的配置。

nodemon.json 文件内容如下:

1
{
2
  "exec": "npm run dev",
3
  "watch": ["src/*"],
4
  "ext": "js, html, css, json"
5
}

这时我们还需要在 package.json 加入一个自定义命令,如下:

1
{
2
  "name": "my_koa",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "dev": "babel-node ./src/index.js",
8
    "watch": "nodemon"
9
  },
10
  "keywords": [],
11
  "author": "Neilyoz",
12
  "license": "ISC",
13
  "devDependencies": {
14
    "@babel/cli": "^7.7.4",
15
    "@babel/core": "^7.7.4",
16
    "@babel/node": "^7.7.4",
17
    "@babel/preset-env": "^7.7.4",
18
    "@babel/register": "^7.7.4",
19
    "eslint": "^6.7.1"
20
  },
21
  "dependencies": {
22
    "koa": "^2.11.0",
23
    "koa-router": "^7.4.0"
24
  }
25
}

这个时候我们执行 npm run watch 再修改 ./src/index.js 的代码,代码保存就可以自动加载了。

生产环境代码生成

因为src 中的代码还是开发环境的代码,并没有通过我们的 babel 进行编译转换,所以直接使用 node 是可能无法启动的,我们需要配置 .babelrc babel 的配置文件,来告诉 babel 具体要做哪些编译。

.babelrc 如下:

1
{
2
  "presets": [
3
    [
4
      "@babel/preset-env",
5
      {
6
        "targets": {
7
          "node": true
8
        }
9
      }
10
    ]
11
  ]
12
}

然后在 package.json 中定义一个 build 命令,内容如下:

1
{
2
  "name": "my_koa",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "build": "babel src --out-dir dist",
8
    "dev": "babel-node ./src/index.js",
9
    "watch": "nodemon"
10
  },
11
  "keywords": [],
12
  "author": "Neilyoz",
13
  "license": "ISC",
14
  "devDependencies": {
15
    "@babel/cli": "^7.7.4",
16
    "@babel/core": "^7.7.4",
17
    "@babel/node": "^7.7.4",
18
    "@babel/preset-env": "^7.7.4",
19
    "@babel/register": "^7.7.4",
20
    "eslint": "^6.7.1"
21
  },
22
  "dependencies": {
23
    "koa": "^2.11.0",
24
    "koa-router": "^7.4.0"
25
  }
26
}

执行我们 npm run build 就会在 my_koa 产生 dist 目录,这个目录里面的代码就是我们应用于生产环境的编译代码。