[TOC]
# REPL 命令行
略~
# 使用 TS 语法
因为 ts 是建立在 js 的基础之上的,但是 node 又不能直接运行 ts 代码,实际使用是往往需要使用 tsc 将 ts 代码编译成 js 代码,这无疑是很麻烦的。
## ts-node
而 ts-node 则包装了 node,它可以直接的运行 ts 代码,使用起来很方便,它的官方仓库在这里 [TypeStrong/ts-node)](https://github.com/TypeStrong/ts-node) , 基本用法请自行查看它的 readme。
## ts-node-dev
node 中有个 nodemon,可以在开发时自动的重启我们的 node 程序,而在 ts-node 中,对应的就是 ts-node-dev
~~~
$ npx ts-node-dev src/index.ts
~~~
# 使用 ES6语法
## 借助 Babel
1. 安装必须包
~~~
npm install babel-register babel-preset-env --D
~~~
2. 新建 `serverjs` 文件
~~~
import Koa from 'koa'
const app = new Koa()
app.listen(3000, console.log("application is start at port 3000"))
~~~
新增一个名为 `start.js` 启动文件:
~~~
// 当然不喜欢吧配置放这里,也可以拿出去,后面介绍
require('babel-register') ({
presets: [ 'env' ]
})
module.exports = require('./server.js')
~~~
接下来用 `node start.js` 来启动!
*****
单独取出配置,新建 `.babelrc` 文件,使用转换 ES2015+ 的 env preset
~~~
{
"presets":[
"env"
]
}
~~~
## babel-node
1. 安装
```
$ npm i -D @babel/core @babel/node @babel/preset-env
```
2. `.babelrc` 文件配置
```
{
"presets": [ "@babel/preset-env" ]
}
```
3. 执行 babel-node
```
$ babel-node test.js
```
注意⚠️:由于性能问题,babel-node 仅限于在本地调试时使用,线上还是需要用 node 去运行!
## `--experimental-modules`
Node 9 开始支持 `ECMAScript Modules` 语法,使用 `import/export` 的文件后缀名必须为 `*.mjs`(?那很多模块使用`js` 咋办?别急,下面会讲利用 **Loader Hooks** 兼容 `*.js` 后缀文件)。
`ECMAScript Modules` 和 `require()` 的 cache 机制不一样。
命令行执行,(脚本后缀名为`.mjs`):
```
$ node --experimental-modules script.mjs # 启动必须加上 `--experimental-modules`
```
Node.js 12 带来了一些非常令人兴奋的改进,例如 **[ES6 模块支持](https://medium.com/@nodejs/announcing-a-new-experimental-modules-1be8d2d6c2ff)**、更好的应用程序安全性和更快的启动速度等。
* 将 `"type": "module"` 添加到项目的 `package.json` 中,且 Node.js 将项目中的所有 `.js` 文件视为 ES 模块。这种方法允许 Node 将 `package.json` 用于包级元数据和配置,做法类似 Babel 等捆绑和配置工具。
* 使用 `.mjs` 结尾的文件会被显式视为模块,使用 `.cjs` 结尾的文件会被视为 CommonJS。这些是仍然使用 `require` 和 `module.exports` 语法类型的文件。
现在这些功能不再需要标志就能使用,真是太棒了。
# 参考
Node已经支持绝大多数ES6功能,这些功能可以在 [node.green](https://node.green/) 网站上看到。
[https://www.c-sharpcorner.com/article/node-js-repl-terminal/](https://www.c-sharpcorner.com/article/node-js-repl-terminal/)