Node服务端开发

2018.8.9

node支持import

### .1

因为目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require。这也是为什么在模块导出时使用module.exports,在引入模块时使用import仍然起效,因为本质上,import会被转码为require去执行。

### .2

检测ES6: npm install -g es-checker -> es-checker
添加ES6支持: npm install babel-cli -g (全局)
npm install babel-preset-es2015 –save
.babelrc文件:
{
“presets”: [
“es2015”
],
“plugins”: []
}
测试ES6: babel-node index.js 或者scripts: “babel”:”babel-node index.js”

### .3

Node.js默认使用的是CommonJS模块。在8.5.0版本后,Node.js支持了JavaScript Modules标准。但是需要添加参数–experimental-modules来开启。默认支持估计要到Node.js 10 LTS了。

同时为了区分使用CommonJS的代码和ES modules的代码,Node.js要求使用ES modules的代码使用.mjs作为后缀名。
详细信息可以参考:Using ES modules natively in Node.js

那有没有办法在Node.js 8.5.0前的版本中使用JavaScript Modules呢?有的,可以使用standard-things/esm: ES modules in Node today!项目。

保存图片

保存客户端/前端上传的图片
前端数据:FormData

1
2
3
4
5
6
7
const formData = new FormData();
const file = event.target.files[0]
const widgetId = this.state.widgetList[index]._id;
formData.append('file', file);
formData.append('widgetId', widgetId);

// fetch(url, {body: formData})

服务端(koajs)处理/接受数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const {
request: { body: { fields, files } },
} = ctx;
// console.log('fields', fields)

const { widgetId } = fields
const { file } = files
// console.log('file', file)
// console.log('file', file.path)

// 此时服务端接受的file.path 是一个服务端带串的路径
let uploadResult = await global.app.utils.uploader.uploadFileByPath(file.name, file.path, {
md5: false,
category: 'snapshot',
removeAfterUploaded: true
});

debug

在node_modules中找到webpack/bin/webpack.js文件顶部加入一行代码,便于调试,

#!/usr/bin/env node –inspect-brk
chrome://inspect在你需要的地方打上debugger;

事件循环

Node.js 事件循环,定时器和 process.nextTick()
六个状态:timers, pending callbacks ,idle, prepare ,poll(轮询) ,check , close callbacks
阶段概述

定时器:本阶段执行已经被 setTimeout() 和 setInterval() 的调度回调函数。
待定回调:执行延迟到下一个循环迭代的 I/O 回调。
idle, prepare:仅系统内部使用。
轮询:检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞。
检测:setImmediate() 回调函数在这里执行。
关闭的回调函数:一些关闭的回调函数,如:socket.on(‘close’, …)。

与浏览器的区别。:v11.x 后基本一致了?

knowledge is no pay,reward is kindness
0%