之前各種node工程都是東抄抄,西抄抄的. 用ng的cli之后,發現非常舒服.所以把node新建工程的種種記錄一下.
node+babel, 直接按es6標准寫就好了, 不需要一定寫ts再轉碼了(寫angular再用ts), 其他情況下用其他語言寫然后轉碼成js的方案, ClosjureScript 效率更高吧).
參考https://www.robinwieruch.de/minimal-node-js-babel-setup/
https://dev.to/bnorbertjs/my-nodejs-setup-mocha--chai-babel7-es6-43ei
1 准備空代碼倉庫
在遠程倉庫(github或者bitbucket)起個空工程 然后復制 "git clone git@XXX/YYY.git"命令 在本地根目錄比如~/dev 起控制台, 運行,得到空文件夾
此時應該包括,但不限於這么幾個文件:
README.md
.gitingore (node版 https://github.com/github/gitignore/blob/master/Node.gitignore)
如果沒有,自己新建,或者從別的工程copy過來
2 創建node工程
在控制台(code下 ctrl + `)
cd 工程路徑
npm init -y
npm i --save express
此時出現:
package.json
package-lock.json
文件夾node_modules
babel
開發時直接寫es6標准的代碼
npm i --save-dev @babel/core @babel/node @babel/preset-env @babel/register
創建.babelrc文件
{ "presets": ["@babel/preset-env"] }
修改package.json
{ "name": "wg-db-json", "version": "1.0.0", "description": "", "main": "src/app.js", "scripts": { "start": "babel-node src/app.js --config=./cfg.yml",
"test": "echo \"Error: no test specified\" && exit 1"
},
...
}
創建src/app.js
import express from "express"; const app = express(); const port = 3000; app.get("/", (req, res) => res.send("Hello World!")); process.on('uncaughtException', function (e) { console.log(e); }); app.listen(port, () => console.log(`Example app listening on port ${port}!`));
注意使用了import from 語句
手工創建cfg.yml (自己的app可能用到的配置文件,已經習慣用yml寫,可以加注釋,省去引號 也比json短小)
nodemon
為了開發時邊修改邊自動重新運行 注意版本號, 之后的版本在我目前的mint19.1/ubuntu18.04上,之后的版本停止任務時, node進程殺不死 重啟會報錯,包括文件編輯
參考https://github.com/remy/nodemon/issues/1508
現在也只能支持在命令行里npm run dev 不支持 vscode里 用按鈕啟動/關閉任務, 但是在vode里點"+"手動創建一個新終端 手動運行npm run dev 實在搞不定,先這樣了
npm i --save-dev nodemon@1.18.7
手工創建一個nodemon.json
{ "ignore": ["**/*.test.js", ".git", "node_modules"], "watch": ["src"], "exec": "npm start", "ext": "js" }
修改package.json
{ "name": "wg-db-json", "version": "1.0.0", "description": "", "main": "src/app.js", "scripts": { "start": "babel-node src/app.js -- --config=./cfg.yml",
"dev": "nodemon",
"test": "echo \"Error: no test specified\" && exit 1"
}, }
這樣開發時, 運行npm dev 通過nodemon 調用 npm start
部署時直接運行npm start即可.
test
npm i --save-dev mocha chai
修改package.json
{ "name": "wg-db-json", "version": "1.0.0", "description": "", "main": "src/app.js", "scripts": { "start": "babel-node src/app.js-- --config=./cfg.yml",
"dev": "nodemon",
"test": "mocha -r @babel/register"
}, ... }
創建test文件夾,隨便創建一個test1.js
import { expect } from 'chai'; import 'mocha'; describe('test1', () => { it('should be', () => { expect('a').to.equal('a'); }); })
解析yml配置文件
1安裝庫,運行時用的,沒有--save-dev選項
npm i js-yaml yargs --save
cfg.yml 隨便寫點內容
PATH_DB: ~/dev/db_test
修改app.js
import express from "express"; import fs from "fs"; //--------讀yaml配置文件------------ const yaml = require('js-yaml'); const argv = require('yargs').argv; console.log('argv', argv); const config = yaml.safeLoad(fs.readFileSync(argv.config, { encoding: 'utf8', flag: "r" })); console.log('yaml config', config); // const app = express(); const port = 3000; app.get("/", (req, res) => res.send("Hello World!")); process.on('uncaughtException', function (e) { console.log(e); }); app.listen(port, () => console.log(`Example app listening on port ${port}!`));
因為這倆庫還是node風格的,所以還是用require導入
雜: 沒關閉的node進程導致端口占用
偶爾code下關閉任務,但是node進程並沒有殺死的情況.
這時無法啟動新的任務.需要手動殺死僵屍進程
lsof -i :端口號
看到確實是node占用了
關閉全部node進程
killall node
這時在啟動,就OK了
PS:
不常從0創建純node工程, 所以記錄一下過程.
1 理解cli的意義了: 沒有cli情況下,自己手動配置各種項,確實不如angular提供了cli方便
2 定制自由度確實比較靈活. 但是也導致了雪花式配置文件, 其實也就babel和nodemon 然后自己程序用的yml 但是各種碎片文件已經不少了.
3 各種配置內容沒有寫在一起, 而是每個都保持三部曲:
1安裝庫
2修改package.json
3增加配置文件
4 遇到第三方庫的版本問題對新手非常不友好. 特別是因為版本的原因導致的停止nodemon時不能正常殺死node進程, 搞了很久 效果和各種google到的都不一樣. 要不是之前用過nodemon 早放棄了.