之前各种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 + `)

  1. cd 工程路径
  2. npm init -y
  1. npm i --save express

此时出现:

package.json

package-lock.json

文件夹node_modules

babel

开发时直接写es6标准的代码

  1. npm i --save-dev @babel/core @babel/node @babel/preset-env @babel/register

创建.babelrc文件

  1. {
  2. "presets": ["@babel/preset-env"]
  3. }

修改package.json

  1. {
  2. "name": "wg-db-json",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "src/app.js",
  6. "scripts": {
  7. "start": "babel-node src/app.js --config=./cfg.yml",
  1. "test": "echo \"Error: no test specified\" && exit 1"
  2. },
  3. ...
  4. }

创建src/app.js

  1. import express from "express";
  2.  
  3. const app = express();
  4. const port = 3000;
  5.  
  6. app.get("/", (req, res) => res.send("Hello World!"));
  7. process.on('uncaughtException', function (e) {
  8. console.log(e);
  9. });
  10.  
  11. 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 实在搞不定,先这样了

  1. npm i --save-dev nodemon@1.18.7

手工创建一个nodemon.json

  1. {
  2. "ignore": ["**/*.test.js", ".git", "node_modules"],
  3. "watch": ["src"],
  4. "exec": "npm start",
  5. "ext": "js"
  6. }

修改package.json

  1. {
  2. "name": "wg-db-json",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "src/app.js",
  6. "scripts": {
  7. "start": "babel-node src/app.js -- --config=./cfg.yml",
    "dev": "nodemon",
    "test": "echo \"Error: no test specified\" && exit 1"
  1. },
  2. }

这样开发时, 运行npm dev     通过nodemon  调用 npm start

部署时直接运行npm start即可.

test

  1. npm i --save-dev mocha chai

修改package.json

  1. {
  2. "name": "wg-db-json",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "src/app.js",
  6. "scripts": {
  7. "start": "babel-node src/app.js-- --config=./cfg.yml",
    "dev": "nodemon",
    "test": "mocha -r @babel/register"
  1. },
  2. ...
  3. }

创建test文件夹,随便创建一个test1.js

  1. import { expect } from 'chai';
  2. import 'mocha';
  3.  
  4. describe('test1', () => {
  5. it('should be', () => {
  6. expect('a').to.equal('a');
  7. });
  8. })

解析yml配置文件

1安装库,运行时用的,没有--save-dev选项

  1. npm i js-yaml yargs --save

cfg.yml 随便写点内容

  1. PATH_DB: ~/dev/db_test

修改app.js

  1. import express from "express";
  2. import fs from "fs";
  3. //--------读yaml配置文件------------
  4. const yaml = require('js-yaml');
  5. const argv = require('yargs').argv;
  6. console.log('argv', argv);
  7. const config = yaml.safeLoad(fs.readFileSync(argv.config, { encoding: 'utf8', flag: "r" }));
  8. console.log('yaml config', config);
  9. //
  10.  
  11. const app = express();
  12. const port = 3000;
  13.  
  14. app.get("/", (req, res) => res.send("Hello World!"));
  15. process.on('uncaughtException', function (e) {
  16. console.log(e);
  17. });
  18.  
  19. app.listen(port, () => console.log(`Example app listening on port ${port}!`));

因为这俩库还是node风格的,所以还是用require导入

杂: 没关闭的node进程导致端口占用

偶尔code下关闭任务,但是node进程并没有杀死的情况.

这时无法启动新的任务.需要手动杀死僵尸进程

  1. lsof -i :端口号

看到确实是node占用了

关闭全部node进程

  1. 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 早放弃了.

新建node工程的更多相关文章

  1. CCS 6新建TMS320F2812工程

    准备材料 CCS6 下载地址:http://www.ti.com/tool/ccstudio F2812的C语言头文件 下载地址:http://www.ti.com/lit/zip/sprc097 安 ...

  2. 如何在Flash Builder里新建ActionScript工程

    新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. ...

  3. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题

    ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...

  4. Cocos Code IDE新建lua工程报错解决方案

    今天想用cocos code IDE新建一个工程,但是控制台报错:Read json file null failed, the reason is:null.我下载的是官方3.5源码,sdk,ndk ...

  5. 新建android工程的时候eclipse没有生成MainActivity和layout布局

    一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...

  6. Android Studio新建Jni工程

    2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...

  7. eclipse 配置Maven问题解决办法:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes .

    此文乃本作者配置maven,被其折磨n天,究极解决方案,好文要顶啊.欢迎致电: zhe-jiang.he@hp.com 首先各maven.archetypes下载地址: http://mirrors. ...

  8. Keil MDK入门---从新建一个工程开始

    熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...

  9. 新建maven工程时pom.xml报错

    新建maven工程时,pom.xml报错:第一行报如下错误:multiple annotations found at this line后添加org.eclipse.m2e相关的plugin配置后, ...

随机推荐

  1. Ububtu 14.04 安装 Hadoop 2.7.3

    1.首先安装java,配置java开发环境 下载jdk:http://www.oracle.com/technetwork/java/javase/archive-139210.html选择你想要下载 ...

  2. java.lang.NoClassDefFoundError 错误

    练习jfianl,,,配置数据库插件的时候遇到: java.lang.NoClassDefFoundError: com/mchange/v2/c3p0/ComboPooledDataSource 解 ...

  3. C++中类型(理解)

    long long类型 转载:https://blog.csdn.net/junecau/article/details/6766033 在做ACM题时, 经常都会遇到一些比较大的整数.而常用的内置整 ...

  4. Markdown编辑工具及命令

    Markdown是一种可以使用普通文本编辑器编辑的标记语言,通过使用简单的编辑,可以使文本具有一定的格式. Typora是一款简介的Markerdown编辑器. 文本编辑语法: 标题: # 一阶标题 ...

  5. MySQL 大表优化方案(长文)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  6. python->读写excel

    from openpyxl import load_workbook#将一个excel文档中的数据存放内存中,即变量wb保存了该excel的所有信息wb = load_workbook(r" ...

  7. Git服务器配置和基本使用

    #git服务器搭建 1. 在系统中增加git用户 useradd -s /usr/bin/git-shell git 2. 在git用户的home目录下新建.ssh目录,做好相关配置 1)生成公私匙: ...

  8. JDK 1.8源码阅读 LinkList

    一,前言 LinkedList是一个实现了List接口和Deque接口的双端链表.有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedL ...

  9. RPC服务和HTTP服务对比

    RPC服务和HTTP服务对比 RPC(即Remote Procedure Call,远程过程调用) 协议区别: RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道H ...

  10. 运行pytorch代码遇到的error解决办法

    1.no CUDA-capable device is detected 首先考虑的是cuda的驱动问题,查看gpu显示是否正常,然后更新最新的cuda驱动: 第二个考虑的是cuda设备的默认参数是否 ...