主题内容:基于 Node.js + Koa 构建完整的 Web API 项目
目标框架:Node.js v14.15.4 (包含 npm 6.14.10)
开发工具:Visual Studio Code (VS Code)
开发平台:macOS Big Sur 11.1 / Windows 10
开发人员:成长的小猪 Jason Song
背景描述:上一篇 基于Node.js构建完整服务端应用(创建 Node.js Web API 项目篇) 我们分别介绍了在 macOS Big Sur / Windows 10 上创建 Node.js Web API 项目 和 创建项目目录结构(项目骨架),这一篇我们将介绍使用 Koa 框架
- 在项目中安装Koa包,在 VS Code 里打开集成的Terminal命令行终端窗口 快捷键 macOS (⌃ + `) / Windows (Ctrl + `),然后执行下命令安装
npm install koa --save-prod 或者 cnpm install koa --save-prod
- 在“ jasonsoft-koa-server”项目根目录创建一个名为 app.js 的文件(初始化相关服务和注入相关中间件),然后我们导入 Koa 框架,下面是官方示例,采用的是“ CommonJS ”规范,使用如下
const Koa = require('koa'); const app = new Koa(); app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000, ()=> { console.log(`[\x1B[36mRunning\x1B[0m] 服务已启动:http://localhost:3000`); });
在 terminal 里执行 “ node app.js ”, Koa 顺利的启动起来了
-
我们的项目将会采用“ ES ”规范,让我们的项目支持 ES6/7/8/9 及更高版本的新特性和语法的支持,我们先将代码改成以下的样子
/** * 初始化相关服务和注入相关中间件 * * Added by Jason.Song (成长的小猪) on 2021/01/31 * 优快云: https://blog.youkuaiyun.com/jasonsong2008 * GitHub: https://github.com/JasonSoft-Net */ import Koa from 'koa'; /** 初始化Koa */ const app = new Koa(); app.use(async ctx => { ctx.body = 'Hello World'; }); /** 监听指定端口,启动服务 */ app.listen(3000, ()=> { console.log(`[\x1B[36mRunning\x1B[0m] 服务已启动:http://localhost:3000`); });
然后在 terminal 里执行 “ node app.js ”,你会发现报错了,如下
➜ jasonsoft-koa-server git:(main) ✗ node app.js (node:33323) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. (Use `node --trace-warnings ...` to show where the warning was created) /Users/jason/Projects/Node/jasonsoft-koa-server/app.js:9 import Koa from 'koa'; ^^^^^^ SyntaxError: Cannot use import statement outside a module at wrapSafe (internal/modules/cjs/loader.js:979:16) at Module._compile (internal/modules/cjs/loader.js:1027:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10) at Module.load (internal/modules/cjs/loader.js:928:32) at Function.Module._load (internal/modules/cjs/loader.js:769:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12) at internal/main/run_main_module.js:17:47
我们发现从上面的执行结果看,Node.js 当前的版本虽然是支持ES语法和特性, 需要我们在node package.json 配置"type": "module",配置了这个属性虽可以解决当前的问题,但上这个配置会影响没有按“ ES module ” 规范编写的包,当我们引用了 “ CommonJS ” 规范编写的包,也会报错误,可能会报如下的错误
/Users/jason/Projects/Node/jasonsoft-koa-controller/example/app.js:18 var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(ctx, next) { ^ ReferenceError: regeneratorRuntime is not defined at /Users/jason/Projects/Node/jasonsoft-koa-controller/example/app.js:7:1
我将在下一篇介绍如何让我们的项目支持 ES6/7/8/9 及更高版本的新特性和语法,且向前兼容的处理方法
项目源码地址:https://github.com/JasonSoft-Net/jasonsoft-koa-server
上一篇 基于Node.js构建完整服务端应用(创建 Node.js Web API 项目篇)
下一篇 基于 Node.js + Koa 构建完整的 Web API (让项目支持 ES6/ES2015 及更高版本的新特性)
如果此文对你有一点点帮助,请给一个赞哦;如果你对此文感兴趣,请关注我,后面将继续更新相关内容,查看我本人更多原创文章,请点击这里=>。