前面的话
fs文件系统用于对系统文件及目录进行读写操作,本文将详细介绍js文件系统
概述
文件 I/O 是由简单封装的标准 POSIX 函数提供的。 通过 require('fs') 使用该模块。 所有的方法都有异步和同步的形式。
异步形式始终以完成回调作为它最后一个参数。 传给完成回调的参数取决于具体方法,但第一个参数总是留给异常。 如果操作成功完成,则第一个参数会是 null 或 undefined
//异步示例var fs = require('fs'); fs.unlink('/tmp/hello', function(err){ if (err) throw err; console.log('successfully deleted /tmp/hello'); });
当使用同步形式时,任何异常都会被立即抛出。 可以使用 try/catch 来处理异常,或让它们往上冒泡
//同步示例var fs = require('fs'); fs.unlinkSync('/tmp/hello'); console.log('successfully deleted /tmp/hello');
异步方法不保证执行顺序。 所以下面的例子容易出错
fs.rename('/tmp/hello', '/tmp/world', function(err){ if (err) throw err; console.log('renamed complete'); }); fs.stat('/tmp/world', function(err, stats){ if (err) throw err; console.log('stats: ${JSON.stringify(stats)}'); });
fs.stat
可能在 fs.rename
之前执行。正确的方法是把回调链起来
fs.rename('/tmp/hello', '/tmp/world', function(err){ if (err) throw err; fs.stat('/tmp/world', function(err, stats){if (err) throw err; console.log('stats: ${JSON.stringify(stats)}'); }); });
推荐开发者使用这些函数的异步版本。 同步版本会阻塞整个进程,直到它们完成(停止所有连接)
底层操作
1、打开文件【fs.open(path, flags[, mode], callback)】
参数如下:
path <string> | <buffer>flags <string> | <number>mode <integer> 设置文件模式(权限和 sticky 位),但只有当文件被创建时才有效。默认为 0666,可读写callback <function> 该回调有两个参数 (err错误, fd文件标识,与定时器标识类似)</function></integer></number></string></buffer></string>
flags可以是:
'r' - 以读取模式打开文件。如果文件不存在则发生异常。'r+' - 以读写模式打开文件。如果文件不存在则发生异常。'rs+' - 以同步读写模式打开文件。命令操作系统绕过本地文件系统缓存。'w' - 以写入模式打开文件。文件会被创建(如果文件不存在)或截断(如果文件存在)。'wx' - 类似 'w',但如果 path 存在,则失败。'w+' - 以读写模式打开文件。文件会被创建(如果文件不存在)或截断(如果文件存在)。'wx+' - 类似 'w+',但如果 path 存在,则失败。'a' - 以追加模式打开文件。如果文件不存在,则会被创建。'ax' - 类似于 'a',但如果 path 存在,则失败。'a+' - 以读取和追加模式打开文件。如果文件不存在,则会被创建。'ax+' - 类似于 'a+',但如果 path 存在,则失败。
[注意]使用'rs+'模式不会使fs.open()进入同步阻塞调用。如果那是你想要的,则应该使用fs.openSync()
var fs = require('fs'); fs.open('a.txt','r',function(err,fs){ console.log(err);//nullconsole.log(fs);//3})
var fs = require('fs'); fs.open('b.txt','r',function(err,fs){/*{ Error: ENOENT: no such file or directory, open 'D:\project\b.txt' at Error (native) errno: -4058, code: 'ENOENT', syscall: 'open', path: 'D:\\project\\b.txt' } */console.log(err); console.log(fs);//undefined})
文件的回调函数中的第二个参数fd代表文件标识,与定时器标识类似,用于标识文件,且随着文件的打开顺序递增
var fs = require('fs'); fs.open('1.txt','r',function(err,fs){ console.log(fs);//3}) fs.open('2.txt','r',function(err,fs){ console.log(fs);//4})
【fs.openSync(path, flags[, mode])】
fs.open() 的同步版本。 返回一个表示文件描述符的整数
var fs = require('fs');var result = fs.openSync('1.txt','r'); console.log(result);//3
2、读取文件【fs.read(fd, buffer, offset, length, position, callback)】
参数如下:
fd <integer> 通过 fs.open() 方法返回的文件描述符 buffer <string> | <buffer> 数据将被写入到buffer offset <integer> buffer中开始写入的偏移量 length <integer> 指定要读取的字节数(整数) position <integer> 指定从文件中开始读取的位置(整数)。 如果position为null,则数据从当前文件位置开始读取 callback <function> 回调有三个参数 (err, bytesRead, buffer)。err为错误信息,bytesRead表示读取的字节数,buffer为缓冲区对象</function></integer></integer></integer></buffer></string></integer>
由于使用read()方法,会将文件内容读取buffer对象中,所以需要提前先准备一个buffer对象
var fs = require('fs'); fs.open('1.txt','r',function(err,fd){if(err){ console.log('文件打开失败'); }else{var bf = Buffer.alloc(5); fs.read(fd,bf,0,3,null,function(err,len,buffer){ console.log(err);//nullconsole.log(len);//3console.log(buffer);//<buffer> }) } });</buffer>
【fs.readSync(fd, buffer, offset, length, position)】
fs.read() 的同步版本,返回 bytesRead 的数量
var fs = require('fs');var fd = fs.openSync('1.txt','r');var bf = Buffer.alloc(5);var result = fs.readSync(fd,bf,0,3,null); console.log(result);//3
3、写入文件【fs.write(fd, buffer, offset, length[, position], callback)】
参数如下
fd <integer> 文件标识 buffer <string> | <buffer> 要将buffer中的数据写入到文件中 offset <integer> buffer对象中要写入的数据的起始位置 length <integer> length是一个整数,指定要写入的字节数 position <integer> 指定从文件开始写入数据的位置的偏移量。 如果 typeof position !== 'number',则数据从当前位置写入 callback <function> 回调有三个参数(err, written, buffer),其中written指定从buffer写入了多少字节</function></integer></integer></integer></buffer></string></integer>
[注意]多次对同一文件使用fs.write且不等待回调,是不安全的。对于这种情况,强烈推荐使用 fs.createWriteStream
当我们要对打开的文件进行写操作的时候,打开文件的模式应该是读写模式
var fs = require('fs'); fs.open('1.txt','r+',function(err,fd){if(err){ console.log('文件打开失败'); }else{var bf = Buffer.from('test'); fs.write(fd,bf,0,3,null,function(err,len,buffer){ console.log(err);//nullconsole.log(len);//3console.log(buffer);//<buffer> }) } });</buffer>

【fs.write(fd, data[, position[, encoding]], callback)】
该方法写入data到fd指定的文件。如果data不是一个Buffer实例,则该值将被强制转换为一个字符串
不同于写入 buffer,该方法整个字符串必须被写入。不能指定子字符串,这是因为结果数据的字节偏移量可能与字符串的偏移量不同
fd <integer> 文件标识 data <string> | <buffer> 要将string或buffer中的数据写入到文件中 position <integer> 指向从文件开始写入数据的位置的偏移量。 如果 typeof position !== 'number',则数据从当前位置写入 encoding <string> 期望的字符串编码 callback <function> 回调有三个参数(err, written, str),其中written指定从str写入了多少字节</function></string></integer></buffer></string></integer>
var fs = require('fs'); fs.open('1.txt','r+',function(err,fd){if(err){ console.log('文件打开失败'); }else{ fs.write(fd,'12345',function(err,len,str){ console.log(err);//nullconsole.log(len);//5console.log(str);//<buffer> }) } });</buffer>

【fs.writeSync()】
fs.write() 的同步版本。返回写入的字节数
var fs = require('fs');var fd = fs.openSync('1.txt','r+');var bf = Buffer.alloc(5);var result = fs.writeSync(fd,bf,0,3,null); console.log(result);//3

4、关闭文件【fs.close(fd, callback)】
一个文件被操作后,要及时将该文件关闭
参数如下:
fd - 通过 fs.open() 方法返回的文件描述符。 callback - 回调函数,没有参数。
var fs = require('fs'); fs.open('1.txt','r+',function(err,fd){if(err){ console.log('文件打开失败'); }else{ fs.close(fd, function(err){if (err){ console.log(err); } console.log("文件关闭成功"); }); } });
【fs.closeSync(fd)】
fs.close(fd, callback)的同步版本,返回undefined
var fs = require('fs');var fd = fs.openSync('1.txt','r+'); fs.closeSync(fd);
File操作
上一部分介绍的都是些底层的操作,接下来将介绍一些更便捷的文件操作。使用下列方法的时候,不需要再打开和关闭文件,直接操作即可
1、写入文件
【fs.writeFile(file, data[, options], callback)】
异步的将数据写入一个文件,如果文件不存在则新建,如果文件原先存在,会被替换
参数如下:
file - 文件名或文件描述符。 data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。 options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
var fs = require('fs');var filename = '1.txt'; fs.writeFile(filename,'hello',function(err){ console.log(err);//null})

【fs.writeFileSync(file, data[, options])】
fs.writeFile() 的同步版本。返回 undefined
var fs = require('fs');var filename = '1.txt'; fs.writeFileSync(filename,'abc');

2、追加文件
【fs.appendFile(filename, data, [options], callback)】
异步地追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 buffer
参数如下
file - 文件名或文件描述符。 data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。 options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
var fs = require('fs');var filename = '1.txt'; fs.appendFile(filename,' world',function(err){ console.log(err);//null})

【fs.appendFileSync(file, data[, options])】
fs.appendFile()的同步版本。返回undefined
var fs = require('fs');var filename = '1.txt'; fs.appendFileSync(filename,' lalala');

3、读取文件
【fs.readFile(file[, options], callback)】
参数如下
file - 文件名或文件描述符 options - 该参数是一个对象,包含 {encoding, flag}。默认编码为null,即如果字符编码未指定,则返回原始的 buffer;flag默认为'r'callback - 回调函数,回调有两个参数 (err, data),其中data是文件的内容(buffer对象),err是错误信息参数,在写入失败时返回
var fs = require('fs');var filename = '1.txt'; fs.readFile(filename,function(err,data){if(err){ console.log('文件读取失败'); }else{ console.log(data);//<buffer>console.log(data.toString());//'abc world lalala' } });</buffer>
【fs.readFileSync(file[, options])】
fs.readFile的同步版本。返回file的内容
如果指定了encoding选项,则该函数返回一个字符串,否则返回一个buffer
var fs = require('fs');var filename = '1.txt';var result = fs.readFileSync(filename); console.log(result);//<buffer>console.log(result.toString());'abc world lalala'</buffer>
4、删除文件
【fs.unlink(path, callback)】
参数如下:
path - 文件路径。 callback - 回调函数,没有参数。
var fs = require('fs');var filename = '1.txt'; fs.unlink(filename, function(err) { if (err) { return console.log('删除失败'); } console.log("删除成功"); });

【fs.unlinkSync(path)】
fs.unlink(path, callback)的同步版本,返回值为undefined
var fs = require('fs');var filename = '1.txt'; fs.unlink(filename);
5、重命名
【fs.rename(oldPath, newPath, callback)】
参数如下:
oldPath <string> | <buffer>newPath <string> | <buffer>callback <function> 回调只有一个可能的异常参数</function></buffer></string></buffer></string>
var fs = require('fs');var filename = 'a.txt'; fs.rename(filename,'2.new.txt',function(err){ console.log(err);//null})
【fs.renameSync(oldPath, newPath)】
fs.rename(oldPath, newPath, callback)的同步版本,返回undefined
var fs = require('fs');var filename = '2.new.txt';var result = fs.renameSync(filename,'a.txt');
6、文件信息
【fs.stat(path, callback)】
fs.stat()执行后,会将stats类的实例返回给其回调函数。可通过stats类中的提供方法判断文件的相关属性
参数如下:
path - 文件路径。 callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象
var fs = require('fs');var filename = 'a.txt'; fs.stat(filename,function(err,stats){ console.log(err);//null/*{ dev: 223576, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 7599824371527537, size: 0, blocks: undefined, atime: 2017-06-03T14:18:15.370Z, mtime: 2017-06-03T14:18:15.370Z, ctime: 2017-06-03T16:32:05.776Z, birthtime: 2017-06-03T14:18:15.370Z } */ console.log(stats); });
stats类中的方法有
stats.isFile() 如果是文件返回 true,否则返回 false。 stats.isDirectory() 如果是目录返回 true,否则返回 false。 stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。 stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。 stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。 stats.isFIFO() 如果是FIFO,返回true,否则返回false。FIFO是UNIX中的一种特殊类型的命令管道。 stats.isSocket() 如果是 Socket 返回 true,否则返回 false。
var fs = require('fs');var filename = 'a.txt'; fs.stat(filename,function(err,stats){ console.log(stats.isFile());//true});
【fs.statSync(path)】
fs.stat(path, callback)方法的同步版本,返回一个 fs.Stats
实例
var fs = require('fs');var filename = 'a.txt';var result = fs.statSync(filename);/*{ dev: 223576, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 7599824371527537, size: 0, blocks: undefined, atime: 2017-06-03T14:18:15.370Z, mtime: 2017-06-03T14:18:15.370Z, ctime: 2017-06-03T16:32:05.776Z, birthtime: 2017-06-03T14:18:15.370Z } */console.log(result);
7、监听
【fs.watch(filename[, options][, listener])】
该方法用于监视filename的变化,filename可以是一个文件或一个目录。返回的对象是一个fs.FSWatcher
参数如下
filename <string> | <buffer>options <string> | <object> 参数可选,如果options是一个字符串,则它指定了encoding。否则options应该以一个对象传入 persistent <boolean> 指明如果文件正在被监视,进程是否应该继续运行。默认为true recursive <boolean> 指明是否全部子目录应该被监视,或只是当前目录。 适用于当一个目录被指定时,且只在支持的平台。默认为false encoding <string> 指定用于传给监听器的文件名的字符编码。默认为'utf8'listener <function> 回调函数有两个参数 (eventType, filename)。 eventType可以是'rename'或'change',filename是触发事件的文件的名称</function></string></boolean></boolean></object></string></buffer></string>
回调中提供的 filename
参数仅在 Linux 和 Windows 系统上支持。 即使在支持的平台中,filename
也不能保证提供。 因此,不要以为 filename
参数总是在回调中提供,如果它是空的,需要有一定的后备逻辑
fs.watch('somedir', (eventType, filename) => { console.log(`事件类型是: ${eventType}`); if (filename) { console.log(`提供的文件名: ${filename}`); } else { console.log('未提供文件名'); } });
var fs = require('fs');var filename = '1.txt'; fs.watch(filename,function(eventType, _filename){ console.log(eventType);//changeif(_filename){ console.log(_filename + '发生了改变');//'1.txt发生了改变'}else{ console.log('...'); } })
[注意]当一个文件出现或消失在一个目录里时,'rename'也会被触发
目录操作
1、创建
【fs.mkdir(path[, mode], callback)】
参数如下:
path - 文件路径。 mode - 设置目录权限,默认为 0777。 callback - 回调函数,回调只有一个可能的异常参数
var fs = require('fs'); fs.mkdir('./1',function(err){ console.log(err);//null})
【fs.mkdirSync(path[, mode])】
fs.mkdir(path[, mode], callback)的同步版本,返回undefined
var fs = require('fs'); fs.mkdirSync('./2');
2、删除
【fs.rmdir(path, callback)】
参数如下:
path - 文件路径。 callback - 回调函数,回调只有一个可能的异常参数
var fs = require('fs'); fs.rmdir('./1',function(err){ console.log(err);//null})
【fs.rmdirSync(path, callback)】
fs.rmdir(path, callback)的同步版本,返回undefined
var fs = require('fs'); fs.rmdirSync('./2');
3、读取
【fs.readdir(path[, options], callback)】
参数如下:
path <string> | <buffer>options <string> | <object> 可选的 options 参数用于传入回调的文件名,它可以是一个字符串并指定一个字符编码,或是一个对象且由一个 encoding 属性指定使用的字符编码。 如果 encoding 设为 'buffer',则返回的文件名会被作为 Buffer 对象传入 encoding <string> 默认 = 'utf8'callback <function> 回调有两个参数 (err, files),其中 files 是目录中不包括 '.' 和 '..' 的文件名的数组</function></string></object></string></buffer></string>
var fs = require('fs'); fs.readdir('./',function(err,data){ console.log(err);//null/*[ '.csslintrc', '.jshintrc', 'a.txt', 'dist', 'Gruntfile.js', 'Gruntfile1.js', 'index.html', 'main.js', 'node_modules', 'package.json', 'src' ] */console.log(data); })
var fs = require('fs'); fs.readdir('./',function(err,data){ data.forEach(function(item,index,arr){ fs.stat(item,function(err,stats){if(stats.isFile()){ console.log('文件:' + item); }if(stats.isDirectory()){ console.log('目录:' + item); } }); }) })/*文件:.jshintrc 文件:.csslintrc 目录:dist 文件:Gruntfile.js 文件:index.html 文件:Gruntfile1.js 文件:main.js 目录:node_modules 文件:package.json 文件:a.txt 目录:src */
【fs.readdirSync(path[, options], callback)】
fs.readdir(path[, options], callback)的同步版本,返回一个不包括 '.'
和 '..'
的文件名的数组
var fs = require('fs');var result = fs.readdirSync('./');/*[ '.csslintrc', '.jshintrc', 'a.txt', 'dist', 'Gruntfile.js', 'Gruntfile1.js', 'index.html', 'main.js', 'node_modules', 'package.json', 'src' ] */console.log(result);
遍历目录
遍历目录是操作文件时的一个常见需求。比如写一个程序,需要找到并处理指定目录下的所有JS文件时,就需要遍历整个目录
遍历目录时一般使用递归算法,否则就难以编写出简洁的代码。递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题
function factorial(n) {if (n === 1) {return 1; } else {return n * factorial(n - 1); } }
上边的函数用于计算N的阶乘(N!)。可以看到,当N大于1时,问题简化为计算N乘以N-1的阶乘。当N等于1时,问题达到最小规模,不需要再简化,因此直接返回1
目录是一个树状结构,在遍历时一般使用深度优先+先序遍历算法。深度优先,意味着到达一个节点后,首先接着遍历子节点而不是邻居节点。先序遍历,意味着首次到达了某节点就算遍历完成,而不是最后一次返回某节点才算数。因此使用这种遍历方式时,下边这棵树的遍历顺序是A > B > D > E > C > F
A / \ B C / \ \ D E F
了解了必要的算法后,我们可以简单地实现以下目录遍历函数
function travel(dir, callback) { fs.readdirSync(dir).forEach(function (file) {var pathname = path.join(dir, file);if (fs.statSync(pathname).isDirectory()) { travel(pathname, callback); } else { callback(pathname); } }); }
可以看到,该函数以某个目录作为遍历的起点。遇到一个子目录时,就先接着遍历子目录。遇到一个文件时,就把文件的绝对路径传给回调函数。回调函数拿到文件路径后,就可以做各种判断和处理。因此假设有以下目录
- /home/user/ - foo/x.js- bar/y.js z.css
使用以下代码遍历该目录时,得到的输入如下
travel('/home/user', function (pathname) { console.log(pathname); });------------------------ /home/user/foo/x.js/home/user/bar/y.js/home/user/z.css
如果读取目录或读取文件状态时使用的是异步API,目录遍历函数实现起来会有些复杂,但原理完全相同。travel
函数的异步版本如下
function travel(dir, callback, finish) { fs.readdir(dir, function (err, files) { (function next(i) {if (i
위 내용은 nodeJS의 fs 파일 시스템 예제 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Dreamweaver Mac版
시각적 웹 개발 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
