2019-04-01

2019-04-01  本文已影响0人  折木丶青梵

一、Init Project

新建目录

mkdir koa2
cd koa2

初始化yarn项目

yarn init

引入koa2

yarn add koa

做服务当然少不了日志啦

引入colors
yarn add colors
logger.js
import colors from 'colors';

export default {
  info(msg) {
    console.log(`[Info] ${colors.white(msg)}`)
  },
  success(msg) {
    console.log(`[success] ${colors.green(msg)}`)
  },
  warn(msg) {
    console.log(`[Warn] ${colors.yellow(msg)}`)
  },
  error(msg) {
    console.log(`[Error] ${colors.red(msg)}`)
  }
};

配置babel

1、首先koa官方推荐使用 Babel 实现 Async 方法(其实不加也不会报错,姿势不对?)

要在 node < 7.6 版本的 Koa 中使用 async 方法, 我们推荐使用 babel's require > hook.

require('babel-register');
// 应用的其余 require 需要被放到 hook 后面
const app = require('./app');

要解析和编译 async 方法, 你至少应该有 [transform-async-to-generator]> (https://babel.bootcss.com/docs/plugins/transform-async-to-> generator/) 或 [transform-async-to-module-method]> (https://babel.bootcss.com/docs/plugins/transform-async-to-module-method/) 插件.
例如, 在你的 .babelrc 文件中, 你应该有:

{
  "plugins": ["transform-async-to-generator"]
}

你也可以用 env preset 的 > target 参数 "node": "current" 替代.

官方推荐的是Babel 7.x以前的做法,作为跨时代的青年,我们当然会选择Babel 7.x后的做法
其实使用起来区别也不大,Babel 7使用@babel/register代替了原来的babel-register

yarn add @babel/register --dev

then 在你的入口文件中首先引入它

require('@babel/register')
....
2、Node 在默认情况下是不支持 import 和 export 的

这里可以分为开发环境和生产环境
开发环境可以使用 babel-node,来运行含有 import/export 语法的 js 代码。

注意:babel-node 不能用于生产环境!因为 babel-node 会加载更多资源和模块,使得运行环境变「重」。

2.1、安装 babel-node
babel-node 命令并非独立安装,在 Babel 7.x 以前,需要通过安装 babel-cli 包获得。而在 Babel 7.x 以后,babel 的模块被被拆分。因此需要安装 @babel/core @babel/node 两个包来获取。

yarn add @babel/cli @babel/core @babel/node --dev
yarn add core-js

2.2、安装 presets 并配置 .babelrc 文件
仅单安装 babel-node 也没用,运行 js 文件后你会发现依然报错。这是因为 babel-node 对 import 语法默认也是关闭的,因此需要安装指定的 preset 并配置 .babelrc 文件来开启语法支持。
截止2019年1月,原有的 babel-preset-es2015 写法已经废弃,与之代替的是 babel-preset-env 或者 @babel/preset-env,推荐后者。

yarn add @babel/preset-env

.babelrc

{
  "presets": [
    ["@babel/preset-env", {
      "debug": false,
      "useBuiltIns": "usage"
      // useBuiltIns参数
      // entry:在引用程序入口导入一次babel/polyfill,多次导入可能会有全局冲突或其他问题。
      // usage:自动为每个文件添加特定的polyfill
      // false:不要为每个文件自动添加polyfill,也不要将“@babel/polyfill”导入到单个polyfill。
    }]
  ],
}

2.3、执行 babel-node
package.json

"scripts": {
    "dev": "babel-node ./server/index.js"
}
npm run dev
yarn add nodemon --dev

then 改变你的启动命令

"scripts": {
  "dev": "nodemon --exec babel-node ./server/index.js"
},

 
生产环境
Node 9提供了一个尚处于 Experimental 阶段的模块,让我们可以抛弃 babel 等一类工具的束缚,直接在 Node 环境下使用 import/export。

所以如果你是纯node项目,并且node运行环境 > 9
可以使用node新的--experimental-modules模式

用前须知

  • Node 版本需在 9.0 及以上
  • 不加 loader 时候,使用 import/export 的文件后缀名必须为 .mjs

首先将所有js文件后缀名都改为mjs
将启动命令修改

"node --experimental-modules ./server/index.mjs"

此时你已经不要require('@babel/register'),因为没有require了
可以根据环境变量process.env.NODE_ENV判断一下是否需要require('@babel/register')

npm run dev

enjoy it

上一篇下一篇

猜你喜欢

热点阅读