2019-04-01
一、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
- tips: 推荐使用nodemon运行你的Node应用,nodemon监视代码中的每个更改,并在您更改某些内容时自动再次启动应用程序
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