Node.js: fs-extra
fs-extra
thêm các phương thức hệ thống tập tin không được bao gồm trong mô-đun fs
cơ bản và thêm hỗ trợ promise cho các phương thức fs
. Nó cũng sử dụng graceful-fs để ngăn lỗi EMFILE
. Nó nên thay thế trực tiếp cho fs
.
Tại sao?
Tôi chán việc phải bao gồm mkdirp
, rimraf
, và ncp
trong hầu hết dự án của mình.
Cài đặt
npm install fs-extra
Sử dụng
CommonJS
fs-extra
là một phiên bản thay thế trực tiếp cho fs
cơ bản. Tất cả các phương thức trong fs
được gắn vào fs-extra
. Tất cả các phương thức fs
trả về promises nếu không truyền callback.
Bạn không cần bao giờ phải bao gồm mô-đun fs
gốc nữa:
const fs = require('fs') // this is no longer necessary
bạn có thể làm như sau:
const fs = require('fs-extra')
hoặc nếu bạn thích làm rõ ràng rằng bạn đang sử dụng fs-extra
chứ không phải fs
, bạn có thể đặt tên biến fs
của bạn thành fse
như sau:
const fse = require('fs-extra')
bạn cũng có thể giữ cả hai, nhưng nó thừa thãi:
const fs = require('fs')
const fse = require('fs-extra')
ESM
Cũng có một phiên bản nhập fs-extra/esm
, hỗ trợ cả xuất mặc định và xuất theo tên. Tuy nhiên, lưu ý rằng các phương thức fs
không được bao gồm trong fs-extra/esm
; bạn vẫn cần phải nhập fs
và/hoặc fs/promises
một cách riêng biệt:
import { readFileSync } from 'fs'
import { readFile } from 'fs/promises'
import { outputFile, outputFileSync } from 'fs-extra/esm'
Xuất mặc định được hỗ trợ:
import fs from 'fs'
import fse from 'fs-extra/esm'
// fse.readFileSync is not a function; must use fs.readFileSync
nhưng bạn có thể muốn chỉ sử dụng fs-extra
thông thường thay vì fs-extra/esm
cho xuất mặc định:
import fs from 'fs-extra'
// both fs and fs-extra methods are defined
Đồng bộ vs Bất đồng bộ vs Bất đồng bộ/Đợi
Hầu hết các phương thức mặc định là bất đồng bộ. Tất cả các phương thức bất đồng bộ sẽ trả về một promise nếu không truyền callback.
Phương thức đồng bộ, mặt khác, sẽ ném ra ngoại lệ nếu có lỗi xảy ra.
Tương tự, Async/Await sẽ ném ra một lỗi nếu có lỗi xảy ra.
Ví dụ:
const fs = require('fs-extra')
// Async with promises:
fs.copy('/tmp/myfile', '/tmp/mynewfile')
.then(() => console.log('success!'))
.catch(err => console.error(err))
// Async with callbacks:
fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
if (err) return console.error(err)
console.log('success!')
})
// Sync:
try {
fs.copySync('/tmp/myfile', '/tmp/mynewfile')
console.log('success!')
} catch (err) {
console.error(err)
}
// Async/Await:
async function copyFiles () {
try {
await fs.copy('/tmp/myfile', '/tmp/mynewfile')
console.log('success!')
} catch (err) {
console.error(err)
}
}
copyFiles()
Phương thức
Async
- copy (sao chép)
- emptyDir (thư mục trống)
- ensureFile (đảm bảo tệp tồn tại)
- ensureDir (đảm bảo thư mục tồn tại)
- ensureLink (đảm bảo liên kết tồn tại)
- ensureSymlink (đảm bảo liên kết mềm tồn tại)
- mkdirp (tạo thư mục đệ quy)
- mkdirs (tạo nhiều thư mục)
- move (di chuyển)
- outputFile (ghi tệp đầu ra)
- outputJson (ghi JSON đầu ra)
- pathExists (kiểm tra tồn tại đường dẫn)
- readJson (đọc JSON)
- remove (xóa)
- writeJson (ghi JSON)
Sync
- copySync (sao chép đồng bộ)
- emptyDirSync (thư mục trống đồng bộ)
- ensureFileSync (đảm bảo tệp tồn tại đồng bộ)
- ensureDirSync (đảm bảo thư mục tồn tại đồng bộ)
- ensureLinkSync (đảm bảo liên kết tồn tại đồng bộ)
- ensureSymlinkSync (đảm bảo liên kết mềm tồn tại đồng bộ)
- mkdirpSync (tạo thư mục đệ quy đồng bộ)
- mkdirsSync (tạo nhiều thư mục đồng bộ)
- moveSync (di chuyển đồng bộ)
- outputFileSync (ghi tệp đầu ra đồng bộ)
- outputJsonSync (ghi JSON đầu ra đồng bộ)
- pathExistsSync (kiểm tra tồn tại đường dẫn đồng bộ)
- readJsonSync (đọc JSON đồng bộ)
- removeSync (xóa đồng bộ)
- writeJsonSync (ghi JSON đồng bộ)
CHÚ Ý: Bạn vẫn có thể sử dụng các phương thức gốc của Node.js. Chúng đã được chuyển đổi sang dạng promise và sao chép vào fs-extra
. Xem ghi chú về fs.read()
, fs.write()
& fs.writev()
walk()
và walkSync()
đã đi đâu?
Chúng đã bị loại bỏ khỏi fs-extra
từ phiên bản 2.0.0. Nếu bạn cần chức năng này, walk
và walkSync
có sẵn như các gói riêng biệt, klaw và klaw-sync.
Bên thứ ba
CLI
fse-cli cho phép bạn chạy fs-extra
từ dòng lệnh hoặc từ các kịch bản npm.
TypeScript
Nếu bạn thích TypeScript, bạn có thể sử dụng fs-extra
với nó: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
Theo dõi Tệp/Tổ mục
Nếu bạn muốn theo dõi sự thay đổi của tệp hoặc thư mục, thì bạn nên sử dụng chokidar.
Lấy thông tin Hệ thống Tệp tin (Thiết bị, Phân vùng)
fs-filesystem cho phép bạn đọc trạng thái của hệ thống tệp tin trên máy chủ mà nó được chạy. Nó trả về thông tin về cả thiết bị và các phân vùng (ổ đĩa) trên hệ thống.
Khác
- fs-extra-debug – Gửi các cuộc gọi fs-extra của bạn đến debug.
- mfs – Giám sát các cuộc gọi fs-extra của bạn.
Hack trên fs-extra
Muốn tham gia vào việc “hack” trên fs-extra
? Tốt quá! Sự giúp đỡ của bạn là cần thiết! fs-extra is one of the most depended upon Node.js packages. Dự án này sử dụng JavaScript Standard Style – nếu tên hoặc lựa chọn kiểu phong cách làm phiền bạn, bạn sẽ cần vượt qua điều đó 🙂 Nếu standard
đủ tốt cho npm
, thì cũng đủ tốt cho fs-extra
.
Cần gì?
- Trước tiên, hãy xem qua các vấn đề hiện có. Đó có lẽ là nơi ưu tiên.
- Thêm các bài kiểm tra cho các trường hợp biên. Cụ thể trên các nền tảng khác nhau. Không bao giờ có quá nhiều bài kiểm tra.
- Cải thiện phạm vi kiểm tra.
Lưu ý: Nếu bạn thực hiện bất kỳ thay đổi lớn nào, bạn nên chắc chắn gửi một vấn đề để thảo luận trước.
Chạy bộ kiểm tra
fs-extra chứa hàng trăm bài kiểm tra.
npm run lint
: chạy công cụ kiểm tra cú pháp (standard)npm run unit
: chạy bài kiểm tra đơn vịnpm run unit-esm
: chạy bài kiểm tra cho các bản xuấtfs-extra/esm
npm test
: chạy công cụ kiểm tra cú pháp và tất cả các bài kiểm tra
Khi chạy các bài kiểm tra đơn vị, hãy đặt biến môi trường CROSS_DEVICE_PATH
thành đường dẫn tuyệt đối của một thư mục trống trên một thiết bị khác (như một ổ đĩa nhỏ) để kích hoạt các bài kiểm tra di chuyển qua thiết bị khác.
Windows
Nếu bạn chạy các bài kiểm tra trên Windows và gặp nhiều lỗi quyền EPERM
cho liên kết biểu tượng, điều đó là do trên Windows bạn cần quyền hạn được nâng cao để tạo ra các liên kết biểu tượng. Bạn có thể thêm điều này vào tài khoản Windows của bạn bằng cách làm theo hướng dẫn ở đây: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7 Tuy nhiên, tôi không có nhiều may mắn khi làm điều này.
Vì tôi phát triển trên Mac OS X, tôi sử dụng VMWare Fusion để kiểm tra trên Windows. Tôi tạo một thư mục chia sẻ mà tôi ánh xạ thành một ổ đĩa trên Windows. Tôi mở Node.js command prompt
và chạy dưới quyền Administrator
. Sau đó, tôi ánh xạ ổ đĩa mạng bằng cách chạy lệnh sau:
net use z: "\\vmware-host\Shared Folders"
Sau đó, tôi có thể dẫn đến thư mục fs-extra
của mình và chạy các bài kiểm tra.
Đặt tên
Tôi đã đặt rất nhiều suy nghĩ vào việc đặt tên cho các hàm này. Được truy inspirated bởi yêu cầu của @coolaj86. Vì vậy, anh ấy xứng đáng nhận một phần tín dụng lớn về việc nêu vấn đề này. Xem cuộc thảo luận ở đây:
- https://github.com/jprichardson/node-fs-extra/issues/2
- https://github.com/flatiron/utile/issues/11
- https://github.com/ryanmcgrath/wrench-js/issues/29
- https://github.com/substack/node-mkdirp/issues/17
Trước hết, tôi tin rằng trong nhiều trường hợp càng nhiều càng tốt, Node.js naming schemes nên được chọn. Tuy nhiên, vấn đề nảy sinh với các hệ thống đặt tên của Node.js.
Ví dụ, fs.readFile()
và fs.readdir()
: F được viết hoa trong File và d không được viết hoa trong dir. Có lẽ hơi chi tiết, nhưng chúng vẫn nên tuân theo nguyên tắc nhất quán. Ngoài ra, Node.js đã chọn nhiều hệ thống đặt tên POSIX, điều mà tôi tin là tốt. Xem: fs.mkdir()
, fs.rmdir()
, fs.chown()
, v.v.
Tuy nhiên, chúng ta có một vấn đề. Làm thế nào để đặt tên nhất quán cho các phương thức thực hiện các lệnh POSIX sau: cp
, cp -r
, mkdir -p
và rm -rf
?
Góc nhìn của tôi: khi không chắc chắn, hãy ưu tiên sự đơn giản. Một thư mục chỉ là một nhóm phân cấp của các thư mục và tệp tin. Hãy cân nhắc điều đó một chút. Vì vậy, khi bạn muốn sao chép hoặc xóa nó, trong hầu hết các trường hợp bạn sẽ muốn sao chép hoặc xóa tất cả nội dung của nó. Khi bạn muốn tạo một thư mục, nếu thư mục mà nó nên chứa không tồn tại, trong hầu hết các trường hợp bạn cũng muốn tạo ra thư mục đó.
Vì vậy, nếu bạn muốn xóa một tệp hoặc thư mục mà không quan trọng nó có nội dung hay không, chỉ cần gọi fs.remove(path)
. Nếu bạn muốn sao chép một tệp hoặc thư mục mà không quan trọng nó có nội dung hay không, chỉ cần gọi fs.copy(source, destination)
. Nếu bạn muốn tạo một thư mục mà không quan trọng thư mục cha của nó đã tồn tại hay chưa, chỉ cần gọi fs.mkdirs(path)
hoặc fs.mkdirp(path)
.
Sự tín dụng
fs-extra
không thể có mặt mà không sử dụng các mô-đun từ các tác giả sau:
Thông tin Tải xuống:
Tác giả: jprichardson
Mã nguồn: https://github.com/jprichardson/node-fs-extra
Giấy phép: MIT license