新建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 早放弃了.
新建node工程的更多相关文章
- CCS 6新建TMS320F2812工程
准备材料 CCS6 下载地址:http://www.ti.com/tool/ccstudio F2812的C语言头文件 下载地址:http://www.ti.com/lit/zip/sprc097 安 ...
- 如何在Flash Builder里新建ActionScript工程
新建ActionScript工程 1. File > New > ActionScript Project 2. 按照提示完成工程的创建 使程序直接在Flash Player中运行 1. ...
- ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...
- Cocos Code IDE新建lua工程报错解决方案
今天想用cocos code IDE新建一个工程,但是控制台报错:Read json file null failed, the reason is:null.我下载的是官方3.5源码,sdk,ndk ...
- 新建android工程的时候eclipse没有生成MainActivity和layout布局
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
- Android Studio新建Jni工程
2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...
- eclipse 配置Maven问题解决办法:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes .
此文乃本作者配置maven,被其折磨n天,究极解决方案,好文要顶啊.欢迎致电: zhe-jiang.he@hp.com 首先各maven.archetypes下载地址: http://mirrors. ...
- Keil MDK入门---从新建一个工程开始
熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...
- 新建maven工程时pom.xml报错
新建maven工程时,pom.xml报错:第一行报如下错误:multiple annotations found at this line后添加org.eclipse.m2e相关的plugin配置后, ...
随机推荐
- C++/C面试题
(1) 按位运算只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用: (2) 一般在打开网页时,需要在浏览器中输入网址,因此,需要通过网址找到访问资源的 IP 地址,从而可以把请求发送到对 ...
- vlan之间的通信-单臂路由与三层交换之间的互通
注:本试验基于单臂路由通信,三层交换通信,请完成以上两个实验,并保证能够通信 熟练掌握单臂路由的配置 熟练掌握三层交换的配置 三层交换与单臂路由的互通 实验原理 三层交换机在原有二层交换机的基础之上增 ...
- ASP.NET常见异常处理示例
将指定的年月日转初始化为DateTime新的实例(Nop.Admin.Controllers.OrderController.ParseProductAttributes) case Attribut ...
- HDFS,MapReduce,Hive,Hbase 等之间的关系
HDFS: HDFS是GFS的一种实现,他的完整名字是分布式文件系统,类似于FAT32,NTFS,是一种文件格式,是底层的. Hive与Hbase的数据一般都存储在HDFS上.Hadoop HDFS为 ...
- ext 的loadmask 与ajax的同步请求水火不容
由于ajax 的同步请求会有一段请求时间.有的短.有的长,对于短的我们还是能接受的,不过长的话就必须处理一下了, 就比如处于ext 4.2.0的框架下,需要一个遮掩的样式,框架是有自带的,loadma ...
- loadView
loadView在View为nil时调用,早于ViewDidLoad,通常用于代码实现控件,收到内存警告时会再次调用.loadView默认做的事情是:如果此VIewcontroller存在一个对应的n ...
- js 整数型数组和字符型数组相互转换
需求背景: 需要将 a = [1,2,3,4,5] 转换成 a = ['1','2','3','4','5'](整数型数组转换成字符型没找到直接的方法,思路就是先将数组转换成字符串,然后再将字符串转 ...
- 2019年度【计算机视觉&机器学习&人工智能】国际重要会议汇总
简介 每年全世界都会举办很多计算机视觉(Computer Vision,CV). 机器学习(Machine Learning,ML).人工智能(Artificial Intelligence ,AI) ...
- Ansible学习实战手记-你想要知道的可能都在这里了
最近接触了ansible工具,查找了一些资料,也做了一些总结.希望能给刚接触的新手带来一些帮助. 此总结有实际例子,大部分也是从实践中用到才逐一总结的. 当然可能肯定一定会存在一些错误和纰漏,还望大家 ...
- sql 存储过程参数为空则不作为条件
/****** Object: StoredProcedure [dbo].[GetCommonGroupByRegion] Script Date: 03/23/2017 17:31:18 **** ...