[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/)