新建node工程


之前各種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 早放棄了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM