Node.js v8.x 中文文档: https://www.nodeapp.cn
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 | const formData = new FormData(); |
服务端(koajs)处理/接受数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16const {
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 后基本一致了?
创建文件夹
创建文件的时候,如果目录不存在会报错。不会自动创建文件夹。
fs.mkdir不能一次创建多层目录,必须先创建上层目录,再创建下层目录.
所以需要(迭代)创建目录。比如路径:a/b/c/f.text
多次调用path.dirname
将会逐层返回上级目录1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33var fs = require("fs");
var path = require("path");
/**
* 递归创建目录 异步方法
*/
function mkdirs(dirname, callback) {
fs.exists(dirname, function(exists) {
if (exists) {
callback();
} else {
//console.log(path.dirname(dirname));
mkdirs(path.dirname(dirname), function() {
fs.mkdir(dirname, callback);
});
}
});
}
/**
* 递归创建目录 同步方法
*/
function mkdirsSync(dirname) {
//console.log(dirname);
if (fs.existsSync(dirname)) {
return true;
} else {
if (mkdirsSync(path.dirname(dirname))) {
fs.mkdirSync(dirname);
return true;
}
}
}