Readfilesync fs: File system | Node.js v16.1.0 Documentation
Содержание
Сравнение взятия из кэша одного и того же файла с помощью fs.readFileSync и fs.readFile (и чтения множества файлов)
Прочитав статью Episode 8: Interview with Ryan Dahl, Creator of Node.js и комментарии к переводу, я решил протестировать эффективность блокирующей и неблокирующей операции чтения файла в Node.js, под катом таблицы и графики.
UPD: Под катом некоректний бенчмарк. Как правильно указали в комментариях, по сути сравнивается взятие из кэша одного и того же файла с помощью fs.readFileSync и fs.readFile.
UPD2: Статья отредактирована, бенчмарк исправлен, результаты добавлены.
Блокирующая операция (fs.readFileSync одна из таких) предполагает что исполнение всего приложения будет приостановлено пока не связанные с JS на прямую операции не будут выполнены.
Неблокирующие опрации позволяют выполнять не связанные с JS операции асинхронно в параллельных потоках (например, fs.readFile).
Больше об blocking vs non-blocking здесь.
Хоть Node.js исполняется в одном потоке, с помощью child_process или cluster можно распределить исполнение кода на несколько потоков.
Были проведены тесты с параллельным и последовательным чтением закэшированого файла (большого и маленького), а также чтения незакешированых файлов.
Все тесты проходили на одном компьютере, с одним HDD, а иммено:
OS: Ubuntu 16.04
Node.js version: 8.4.0
Processor: AMD Phenom(tm) 9750 Quad-Core Processor
Physical cores: 4
HDD: 2TB 7200rpm 64MB
File system type: ext4
file.txt size: 3.3 kB
bigFile.txt size: 6.5 MB
Результаты для закэшированого файла.
При чтении 3.3 kB файла 10 000 раз
Symbol | Name | ops/sec | Percents |
---|---|---|---|
A | Loop readFileSync | 7.4 | 100% |
B | Promise chain readFileSync | 4.47 | 60% |
C | Promise chain readFile | 1. 09 | 15% |
D | Promise.all readFileSync | 4.58 | 62% |
E | Promise.all readFile | 1.69 | 23% |
F | Multithread loop readFileSync | 20.05 | 271% |
G | Multithread promise.all readFile | 4.98 | 67% |
При чтении 3.3 kB файла 100 раз
Symbol | Name | ops/sec | Percents |
---|---|---|---|
A | Loop readFileSync | 747 | 100% |
B | Promise chain readFileSync | 641 | 86% |
C | Promise chain readFile | 120 | 16% |
D | Promise.all readFileSync | 664 | 89% |
E | Promise. all readFile | 238 | 32% |
F | Multithread loop readFileSync | 1050 | 140% |
G | Multithread promise.all readFile | 372 | 50% |
При чтении 6.5 MB файла 100 раз
Symbol | Name | ops/sec | Percents |
---|---|---|---|
A | Loop readFileSync | 0.63 | 83% |
B | Promise chain readFileSync | 0.66 | 87% |
C | Promise chain readFile | 0.61 | 80% |
D | Promise.all readFileSync | 0.66 | 87% |
E | Promise.all readFile | 0.76 | 100% |
F | Multithread loop readFileSync | 0. 83 | 109% |
G | Multithread promise.all readFile | 0.81 | 107% |
Загрузка процессора при чтении 3.3 kB файла 10 000 раз
Загрузка процессора при чтении 6.5 MB файла 100 раз
Как видим fs.readFileSync всегда исполняется в одном потоке на одном ядре. fs.readFile в своей работе использует несколько потоков, но ядра при этом загружены не на полную мощность. Для небольшого файла fs.readFileSync работает быстрее чем fs.readFile, и только при чтении большого файла при ноде запущенной в одном потоке fs.readFile исполняется быстрее чем fs.readFileSync.
Следовательно, чтение небольших файлов лучше проводить с помощью fs.readFileSync, а больших файлов с помощью fs.readFile (насколько файл должен быть большой зависит от компьютера и софта).
Для некоторых задач fs.readFileSync может быть предпочтительнее и для чтения больших файлов. Например при длительном чтении и обработке множества файлов. При этом нагрузку между ядрами надо распределять с помощью child_process. Грубо говоря, запустить саму ноду, а не операции в несколько потоков.
UPD2
Ниже данные полученные для при чтении множества незакешированых файлов одинакового размера (3,3kB).
При чтении по 1000 файлов
Symbol | Name | ops/sec | Percents |
---|---|---|---|
A | Loop readFileSync | 8.47 | 74% |
B | Promise chain readFileSync | 6.28 | 55% |
C | Promise chain readFile | 5.49 | 48% |
D | Promise.all readFileSync | 8.06 | 70% |
E | Promise.all readFile | 11.05 | 100% |
F | Multithread loop readFileSync | 3. 71 | 32% |
G | Multithread promise.all readFile | 5.11 | 44% |
При чтении по 100 файлов
Symbol | Name | ops/sec | Percents |
---|---|---|---|
A | Loop readFileSync | 79.19 | 85% |
B | Promise chain readFileSync | 50.17 | 54% |
C | Promise chain readFile | 48.46 | 52% |
D | Promise.all readFileSync | 54.7 | 58% |
E | Promise.all readFile | 92.87 | 100% |
F | Multithread loop readFileSync | 80.46 | 86% |
G | Multithread promise.all readFile | 92. 19 | 99% |
Загрузка процессора при чтении незакешированых файлов небольшая, порядка 20%. Результаты варьируются ± 30%.
По результатам видно что использовать неблокирующий fs.readFile выгоднее.
Пример ситуации чтения файла.
Допустим у нас крутится веб сервер на ноде в одном потоке T1. На сервер одновременно приходит два запроса (P1 и P2) чтения и обработки небольших файлов (по одному на запрос). При использовании fs.readFileSync последовательность исполнения кода в потоке Т1 будет выглядеть так:
P1 -> P2
При использовании fs.readFile последовательность исполнения кода в потоке Т1 будет выглядеть так:
P1-1 -> P2-1 -> P1-2 -> P2-2
Где P1-1, P2-1 — делегирование чтения в другой поток, P1-2, P2-2 — получение результатов чтения и обработка данных.
fs [Амперка / Вики]
Объект реализует работу с SD-картами. Класс написан по аналогии с модулем fs
Node.js. Ввиду ограничений платформы, реализовать асинхронные обращения к карте памяти невозможно — все методы работают в синхронном режиме. Для подключения модуля, необходимо воспользоваться командой var fs = require('fs')
.
Если вам необходимо обрабатывать файлы большого размера, следует использовать класс File. Этот класс поддерживает блочное чтение файлов, что позволит избежать ошибки нехватки памяти.
fs.appendFileSync(fileName, data)
Дописывает в конец файла fileName
данные data
. Возвращает true
при успешной записи или false
, если запись не удалась.
fs.appendFile(fileName, data)
Дописывает в конец файла fileName
данные data
. Возвращает true
при успешной записи или false
, если запись не удалась. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.appendFileSync
.
fs.pipe(source, destination, options)
Возвращает содержимое каталога path
в виде массива. Если параметр path
не передан — выводится информация о корневом каталоге.
// Настаиваем SPI2 SPI2.setup({mosi:B15, miso:B14, sck:B13}); // Подключаем объект работы с файловой системой var fs = require("fs"); // Подключаем SD-карту E.connectSDCard(SPI2, P4 /*CS*/); // Выводим список файлов в корне карты print(fs.readdirSync()); /* [ "System Volume Information", "CXT.TXT", "1.wav", "index.htm", "headers.htm", "http.htm", "htmll.htm", "index2.htm", "index3.htm", "index4.htm", "index5.htm", "index6.htm", "index7.htm", "index8.htm", "index9.htm", "indexP2.htm", "indexP1.htm", "indexP3.htm", "Arduino.raw" ] */
Возвращает содержимое каталога path
в виде массива. Если параметр path
не передан — выводится информация о корневом каталоге. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.readdirSync
.
fs.readFileSync(fileName)
Функция возвращает содержимое файла fileName
или ошибку. Учтите, размер возвращенных данных может занять всю память! Для работы с большими данными используйте класс File.
// Настаиваем SPI2 SPI2.setup({mosi:B15, miso:B14, sck:B13}); // Подключаем объект работы с файловой системой var fs = require("fs"); // Подключаем SD-карту E.connectSDCard(SPI2, P4 /*CS*/); // Выводим список файлов в корне карты var files = fs.readdirSync(); // Выводим информацию, хранящуюся в 3-м файле print(fs.readFileSync(files[2])); /* Пример вывода: test */
Возвращает содержимое файла fileName
или ошибку. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.readFileSync
.
Возвращает объект со свойствами содержащими информацию о файле fileName
. Объект имеет свойства:
size
— размер в байтахdir
— путь к файлу-
mtime
— объект Date, содержащий время создания файла
// Настаиваем SPI2 SPI2. setup({mosi:B15, miso:B14, sck:B13}); // Подключаем объект работы с файловой системой var fs = require("fs"); // Подключаем SD-карту E.connectSDCard(SPI2, P4 /*CS*/); // Выводим список файлов в корне карты var files = fs.readdirSync(); // Выводим информацию о 3-м файле print(fs.statSync(files[2])); /* Пример выводимой информации { "size": 131103, "dir": false, "mtime": { "ms": 949366800000 } } */
Удаляет файл fileName
и возвращает true
при удачном удалении или false
, если удаление не произошло.
Удаляет файл fileName
и возвращает true
при удачном удалении или false
, если удаление не произошло. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.unlinkSync
.
fs.writeFileSync(fileName, data)
Записывает в файл fileName
данных из параметра data
. Если файл существует — он будет перезаписан. Возвращает true
в случае успешной записи или ошибку.
// Настаиваем SPI2 SPI2.setup({mosi:B15, miso:B14, sck:B13}); // Подключаем объект работы с файловой системой var fs = require("fs"); // Подключаем SD-карту E.connectSDCard(SPI2, P4 /*CS*/); // Выводим список файлов в корне карты var files = fs.readdirSync(); // Выводим информацию о записи в файл данных print(fs.writeFileSync(files[2], 'new data')); /* Пример вывода: true - если запись была успешной */
fs.writeFile(fileName, data)
Записывает в файл fileName
данных из параметра data
. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.writeFileSync
.
Совместимость
Совместимость
njs совместим с
ECMAScript 5.1
(строгий режим) c некоторыми расширениями
ECMAScript 6
и позже.
Совместимость находится в стадии развития.
Описания методов и свойств, доступных только в njs
и не соответствующих стандарту ECMAScript, доступны в
справочнике.
Описания методов и свойств njs,
соответствующих стандарту, доступны в
спецификации
ECMAScript.
Готовая функциональность
- Логические значения, числа, строки, объекты, массивы,
функции, конструкторы функций
(0.3.6)
и регулярные выражения - ES5.1 операторы, ES7 операторы возведения в степень
- ES5.1 инструкции:
break
,
catch
,
continue
,
do while
,
else
,
finally
,
for
,
for in
,
if
,
return
,
switch
,
throw
,
try
,
var
,
while
,
инструкции меток (labels) (0.2.8) - Свойства
Math
:- ES6:
E
,
LN10
,
LN2
,
LOG10E
,
LOG2E
,
PI
,
SQRT1_2
,
SQRT2
- ES6:
- Методы
Math
:- ES6:
abs
,
acos
,
acosh
,
asin
,
asinh
,
atan
,
atan2
,
atanh
,
cbrt
,
ceil
,
clz32
,
cos
,
cosh
,
exp
,
expm1
,
floor
,
fround
,
hypot
,
imul
,
log
,
log10
,
log1p
,
log2
,
max
,
min
,
pow
,
random
,
round
,
sign
,
sin
,
sinh
,
sqrt
,
tan
,
tanh
,
trunc
- ES6:
- Свойства
Number
:- ES6:
EPSILON
,
MAX_SAFE_INTEGER
,
MAX_VALUE
,
MIN_SAFE_INTEGER
,
MIN_VALUE
,
NEGATIVE_INFINITY
,
NaN
,
POSITIVE_INFINITY
- ES6:
- Методы
Number
:- ES6:
isFinite
,
isInteger
,
isNaN
,
isSafeInteger
,
parseFloat
,
parseInt
- ES6:
- Методы экземпляра класса
Number
: - Методы
String
:- ES5. 1:
fromCharCode
- ES6:
fromCodePoint
- ES5. 1:
- Методы экземпляра класса
String
:- ES5.1:
charAt
,
concat
,
indexOf
,
lastIndexOf
,
match
,
replace
,
search
,
slice
,
split
,
substr
,
substring
,
toLowerCase
,
trim
,
toUpperCase
- ES6:
codePointAt
,
endsWith
,
includes
,
repeat
,
startsWith
- ES8:
padEnd
,
padStart
- ES9:
trimEnd
(0.3.4),
trimStart
(0.3.4) - нестандартные:
bytesFrom
(0.2.3),
fromBytes
,
fromUTF8
,
toBytes
,
toUTF8
- ES5.1:
- Методы
Object
:- ES5.1:
create
(поддержка без списка свойств),
defineProperties
(поддержка дескрипторов доступа
начиная с версии 0. 3.3),
defineProperty
(поддержка дескрипторов доступа
начиная с версии 0.3.3),
freeze
,
getOwnPropertyDescriptor
,
getOwnPropertyDescriptors
(0.3.1),
getOwnPropertyNames
(0.3.1),
getPrototypeOf
,
isExtensible
,
isFrozen
,
isSealed
,
keys
,
preventExtensions
,
seal
- ES6:
assign
(0.3.7) - ES8:
entries
(0.2.7),
values
(0.2.7)
- ES5.1:
- Методы экземпляра класса
Object
:- ES5.1:
hasOwnProperty
,
isPrototypeOf
,
(0.3.0),
propertyIsEnumerable
,
toString
,
valueOf
- ES6:
is
(0.3.8),
setPrototypeOf
(0.3.8)
- ES5.1:
- Методы
Array
: - Методы экземпляра класса
Array
:- ES5.1:
concat
,
every
,
filter
,
forEach
,
indexOf
,
join
,
lastIndexOf
,
map
,
pop
,
push
,
reduce
,
reduceRight
,
reverse
,
shift
,
slice
,
some
,
sort
,
splice
,
unshift
- ES6:
copyWithin
(0. 3.7),
fill
,
find
,
findIndex
- ES7:
includes
- ES5.1:
- Методы
ArrayBuffer
(0.3.8): - Методы экземпляра класса
ArrayBuffer
(0.3.8): - Конструкторы
Typed-array
(0.3.8):- ES6:
Int8Array
,
Uint8Array
,
Uint8ClampedArray
,
Int16Array
,
Uint16Array
,
Int32Array
,
Uint32Array
,
Float32Array
,
Float64Array
- ES6:
- Методы экземпляра класса
Typed-array
(0.3.8):- ES6:
copyWithin
,
every
(0.4.4),
fill
,
filter
(0.4.4),
find
(0.4.4),
findIndex
(0.4.4),
forEach
(0.4.4),
includes
(0.4.4),
indexOf
(0.4.4),
join
,
lastIndexOf
(0.4.4),
map
(0.4.4),
reduce
(0.4. 4),
reduceRight
(0.4.4),
reverse
(0.4.4),
set
,
slice
,
some
(0.4.4),
sort
(0.4.2),
subarray
,
toString
- ES6:
- Методы
Buffer
(0.4.4): - Методы экземпляра класса
Buffer
:
(0.4.4):-
compare
,
copy
,
equals
,
fill
,
includes
,
indexOf
,
lastIndexOf
,
readIntBE
,
readInt8
,
readInt16BE
,
readInt32BE
,
readIntLE
,
readInt8
,
readInt16LE
,
readInt32LE
,
readUIntBE
,
readUInt8
,
readUInt16BE
,
readUInt32BE
,
readUIntLE
,
readUInt8
,
readUInt16LE
,
readUInt32LE
,
readDoubleBE
,
readDoubleLE
,
readFloatBE
,
readFloatLE
,
subarray
,
slice
,
swap16
,
swap32
,
swap64
,
toJSON
,
toString
,
write
,
writeIntBE
,
writeInt8
,
writeInt16BE
,
writeInt32BE
,
writeIntLE
,
writeInt8
,
writeInt16LE
,
writeInt32LE
,
writeUIntBE
,
writeUInt8
,
writeUInt16BE
,
writeUInt32BE
,
writeUIntLE
,
writeUInt8
,
writeUInt16LE
,
writeUInt32LE
,
writeDoubleBE
,
writeDoubleLE
,
writeFloatBE
,
writeFloatLE
-
- Методы
Promise
(0. 3.8): - Методы экземпляра класса
Promise
(0.3.8):- ES6:
catch
,
finally
,
then
- ES6:
- Методы экземпляра класса
Function
: - Методы экземпляра класса
RegExp
:- ES5.1:
exec
,
test
,
toString
- ES5.1:
-
RegExp
ES9 именные группы записи (0.3.2) - Методы экземпляра класса
DataView
(0.4.4):- ES6:
getFloat32
,
getFloat64
,
getInt16
,
getInt32
,
getInt8
,
getUint16
,
getUint32
,
getUint8
,
setFloat32
,
setFloat64
,
setInt16
,
setInt32
,
setInt8
,
setUint16
,
setUint32
,
setUint8
- ES6:
- Методы
Date
: - Методы экземпляра класса
Date
:- ES5. 1:
getDate
,
getDay
,
getFullYear
,
getHours
,
getMilliseconds
,
getMinutes
,
getMonth
,
getSeconds
,
getTime
,
getTimezoneOffset
,
getUTCDate
,
getUTCDay
,
getUTCFullYear
,
getUTCHours
,
getUTCMilliseconds
,
getUTCMinutes
,
getUTCMonth
,
getUTCSeconds
,
toDateString
,
toISOString
,
toLocaleDateString
,
toLocaleString
,
toLocaleTimeString
,
toTimeString
,
toUTCString
,
setDate
,
setFullYear
,
setHours
,
setMinutes
,
setMilliseconds
,
setMonth
,
setSeconds
,
setTime
,
setUTCDate
,
setUTCFullYear
,
setUTCHours
,
setUTCMilliseconds
,
setUTCMinutes
,
setUTCMonth
,
setUTCSeconds
- ES5. 1:
- Методы
JSON
: - ES5. 1 объект
arguments
(0.2.5) - ES6 синтаксис rest параметров (без поддержки деструктуризации)
(0.2.7) - ES5.1 global functions:
decodeURI
,
decodeURIComponent
,
encodeURI
,
encodeURIComponent
,
isFinite
,
isNaN
,
parseFloat
,
parseInt
- Объекты
Error
:
Error
,
EvalError
,
InternalError
,
RangeError
,
ReferenceError
,
SyntaxError
,
TypeError
,
URIError
- Функции
clearTimeout
и
setTimeout
(0.2.0) - Методы
File system
:
fs.accessSync
(0.3.9),
fs.appendFileSync
,
fs.mkdirSync
(0.4.2),
fs.readdirSync
(0.4.2),
fs.readFileSync
,
fs.realpathSync
(0.3.9),
fs.renameSync
(0.3.4),
fs.rmdirSync
(0.4. 2),
fs.symlinkSync
(0.3.9),
fs.unlinkSync
(0.3.9),
fs.writeFileSync
-
fs.promises
API (0.3.9),
асинхронная версия файловых методов file system. - Методы
Crypto
(0.2.0):
crypto.createHash
,
crypto.createHmac
- Методы
Query String
(0.4.3):
querystring.decode
,
querystring.encode
,
querystring.escape
,
querystring.parse
,
querystring.stringify
,
querystring.unescape
- Методы
TextDecoder
(0.4.3):
encoding
,
fatal
,
ignoreBOM
,
decode
- Методы
TextEncoder
(0.4.3):
encode
,
encodeInto
- ES6 поддержка модулей:
инструкции
export
по умолчанию и
import
по умолчанию
(0.3.0) - ES6 поддержка стрелочных функций
(0.3.1) - Шаблонные строки:
многострочные литералы, интерполяция выражений, вложенные шаблоны
(0. 3.2) - Глобальные объекты
(0.3.3):
browserify / brfs: browserify fs.readFileSync () инлайнер статических ресурсов
Преобразование просмотра статических ресурсов fs.readFileSync () и fs.readFile ()
Этот модуль представляет собой плагин для просмотра и синтаксического анализа AST.
для вызовов fs.readFileSync ()
, чтобы вы могли встроить содержимое файла в свой
связки.
Несмотря на то, что этот модуль предназначен для использования с браузером, в нем нет ничего
особенно специфичен для просмотра, поэтому он должен быть вообще полезен в других
проекты.
для main.js:
var fs = require ('fs'); var html = fs.readFileSync (__ dirname + '/robot.html', 'utf8'); console.log (HTML);
и robot.html:
сначала npm установите brfs
в свой проект, затем:
в командной строке
$ browserify -t brfs example / main.js> bundle.js
теперь в выходном файле пакета,
var html = fs. readFileSync (__ dirname + '/robot.html', 'utf8');
превращается в:
var html = " гудок \ n";
или с api
var browserify = require ('browserify'); var fs = require ('fs'); var b = browserify ('example / main.js '); b.transform ('brfs'); b.bundle (). pipe (fs.createWriteStream ('bundle.js'));
асинхронный
Вы также можете использовать fs.readFile ()
:
var fs = require ('fs'); fs.readFile (__ dirname + '/robot.html', 'utf8', function (err, html) { console.log (HTML); });
Когда вы запускаете этот код через brfs, он превращается в:
var fs = require ('fs'); process.nextTick (function () {(function (err, html) { console.log (HTML); }) (null, " гудок \ n")});
brfs ищет:
-
фс.readFileSync (pathExpr, enc = null)
-
fs.readFile (pathExpr, enc = null, cb)
-
fs.readdirSync (pathExpr)
-
fs. readdir (pathExpr, cb)
Внутри каждого pathExpr
можно использовать
статически анализируемые выражения и
эти переменные и функции:
-
__dirname
-
__ имя файла
-
путь
, если выvar path = require ('path')
первый -
требуется.решить ()
Как и node, кодировка по умолчанию — null
и вернет буфер
.
Если вы хотите, чтобы содержимое файла с различным кодированием для вашего встроенного контента, вы можете
установите enc
на 'utf8'
, 'base64'
или 'hex'
.
В асинхронном режиме, когда задан обратный вызов cb
, содержимое pathExpr
встроен в исходный код внутри вызова process.nextTick ()
.
При использовании 'файла'
-наблюдателя событий, такого как
watchify, встроенные ресурсы будут
обновляется автоматически.
Если вы хотите использовать этот плагин напрямую, а не через браузер, api
следует.
var brfs = требуется ('brfs')
var tr = brfs (файл, параметры)
Возврат сквозного потока tr
встраивание fs.readFileSync ()
содержимого файла
на месте.
При желании вы можете установить, какие опц. Вар.
будут использоваться в
статическая оценка аргумента
в дополнение к __dirname
и __filename
.
opts.parserOpts
можно использовать для настройки парсера, который использует brfs,
желудь.
tr.on (‘файл’, функция (файл) {})
Для каждого файла, включенного в fs.readFileSync ()
или fs.readFile ()
, tr
экземпляр генерирует событие «файл»
с путем файла
.
Крошечная программа командной строки поставляется с этим модулем, чтобы упростить отладку.
использование:
brfs файл
Встроенный файл `fs. readFileSync () `вызывает из` файла`, распечатывая преобразованный файл
содержимое в стандартный вывод.
brfs
brfs -
Встроенные вызовы fs.readFileSync () из stdin, печать преобразованного файла
содержимое в стандартный вывод.
С npm do:
, затем используйте -t brfs
с командой browserify или используйте .transform ('brfs')
из
API-интерфейс просмотра.
Поскольку brfs
оценивает исходный код статически , вы не можете использовать динамические выражения, которые необходимо оценивать во время выполнения.Например:
// РАБОТАТЬ НЕ БУДЕТ! var file = window.someFilePath; var str = require ('fs'). readFileSync (файл, 'utf8');
Вместо этого вы должны использовать более простые выражения, которые могут быть разрешены во время сборки:
var str = require ('fs'). ReadFileSync (__ dirname + '/file.txt', 'utf8');
Еще одна проблема: brfs
еще не поддерживает ES-модуль import
операторов. См. Brfs-babel для экспериментальной замены, поддерживающей этот синтаксис.
MIT
🐢 Эмуляция узла
Некоторые функции, которые в конечном итоге имитируют Node.js API
🌳 Переменные среды
Parcel использует dotenv для поддержки загрузки переменных среды из файлов .env
.
.env
файлы должны храниться вместе с package.json
, который содержит вашу зависимость parcel-bundler
.
Parcel загружает файлов .env
с этими конкретными именами для следующих значений NODE_ENV
:
действующий .env имена файлов | NODE_ENV = * | NODE_ENV = тест |
---|---|---|
.env | ✔️ | ✔️ |
.env.local | ✔️ | ✖️ |
. env. $ {NODE_ENV} | ✔️ | ✔️ |
.env. $ {NODE_ENV} .local | ✔️ | ✔️ |
Примечательно:
-
NODE_ENV
по умолчаниюразработка
. -
.env.local
не загружается, еслиNODE_ENV = test
, поскольку тесты должны давать одинаковые результаты для всех - Иногда введение нового файла .env не срабатывает сразу. В этом случае попробуйте удалить каталог .cache /.
- Прямой доступ к объекту
process.env
не поддерживается, но доступ к конкретным переменным на нем, напримерprocess.env.API_KEY
, предоставит ожидаемое значение. - Используйте встроенный
процесс
Node.js global, т.е. не выполнять импортиз «процесса»
. Если вы используете TypeScript, вы, вероятно, захотите установить@ types / node
для его компиляции.
🕳️ Полифиллинг и исключение встроенных узловых модулей
При импорте пакетов (или, что более вероятно, зависимости), таких как crypto
, fs
или , процесс
, Parcel либо автоматически использует один из перечисленных полифиллов, либо исключает этот модуль. Вы можете использовать поле псевдонимов
в своем пакете .json
собственный модуль | замена npm | собственный модуль | замена npm |
---|---|---|---|
утверждение | утверждение | процесс | процесс / browser.js |
буфер | буфер | punycode | punycode |
консоль | Консоль-просмотр | строка запроса | querystring-es3 |
константы | константы - просмотр | поток | читаемый поток |
крипто | криптографический просмотр | string_decoder | string_decoder |
домен | домен-браузер | системный | утилит / утилит. js |
событий | событий | таймеры | таймеры-просмотр |
http | поток-http | терминал | tty-браузер |
https | https-браузер | URL | url |
ос | os-browserify / browser.js | , утилита | утилит / утилит.js |
путь | путь-просмотр | vm | vm-браузер |
злиб | browserify-zlib |
📄 Встраивание fs.readFileSync
Вызовы fs.readFileSync
заменяются содержимым файла, если путь к файлу статически определяется и находится внутри корня проекта
-
fs.readFileSync (..., "utf8")
: с константами в виде строки с (или любой другой допустимой кодировкой) -
fs. readFileSync (...)
: объект Buffer (например,Buffer.from (....)
вместе с потенциально необходимым полифилом)
построить index.js
index.js :
импорт фс из «фс»;
импортировать путь из «пути»;
const data = fs.readFileSync (path.join (__ dirname, "data.json"), "utf8");
консоль.журнал (данные);
data.json :
{
"foo": "bar"
}
🔧 Отключение этих функций
Встраивание переменных среды и вызовов readFileSync
можно отключить с помощью ключа @ parcel / transformer-js
в пакете package.json
:
package.json :
{
"name": "my-project",
"dependencies": {
...
},
"@ parcel / transformer-js": {
"inlineFS": false,
"inlineEnvironment": ложный
}
}
inlineEnvironment
также может быть массивом глобальных строк:
{
"name": "my-project",
"dependencies": {
. ..
},
"@ parcel / transformer-js": {
"inlineEnvironment": ["SENTRY_ *"]
}
}
inlineFS
применяется к вызовам readFileSync
и inlineEnvironment от
до process.env.SOMETHING
:
{
inlineFS: boolean,
inlineEnvironment: boolean | Массив
}
(Эта функция обеспечивается @ parcel / transformer-js
и @ parcel / resolver-default
.)
Отредактируйте эту страницу на GitHub
FS API
Интерфейс:
Файловая система
API файловой системы обеспечивает возможность чтения и записи файлов.
Он разработан, чтобы быть совместимым с API файловой системы Node.js.
импорт {readFileSync} из «фс»;
let text = readFileSync ("my_file.txt", "utf-8");
console.log (текст);
Узнайте больше об этом API в
Руководство по файловой системе
existsSync ()
Новое в SDK 4. 0
Проверить, существует ли данный путь и доступен ли он через
файловая система.
fs.existsSync (путь: строка)
Параметры
путь : строка
Имя пути для проверки на наличие.
writeFileSync ()
Записать данные в файл за одну операцию. Если файл с таким именем
уже существует, он перезаписан; в противном случае создается новый файл.
fs.writeFileSync (имя файла: строка, данные: ArrayBuffer | ArrayBufferView)
Параметры
имя файла : строка
Имя файла для записи.
данные : ArrayBuffer или ArrayBufferView
Если кодировка не указана, данных
— это буфер двоичных данных.
С кодировкой == "ascii"
или "utf-8"
, data
— это строка, которая будет
сериализован с соответствующей кодировкой. С кодировкой == "cbor"
или
"json"
, data
— это объект, который будет сериализован с помощью CBOR или
Кодировка JSON соответственно.
фс.writeFileSync (имя файла: строка, данные: строка, кодировка: «ascii» | «utf-8»)
Параметры
имя файла : строка
данные : строка
кодировка : "ascii" или "utf-8"
fs.writeFileSync (имя файла: строка, данные: любые, кодировка: «cbor» | «json»)
Параметры
имя файла : строка
данные : любые
кодировка : "cbor" или "json"
readFileSync ()
Прочитать весь файл в буфер за одну операцию.
fs.readFileSync (имя файла: строка)
Параметры
имя файла : строка
Имя файла для чтения.
fs.readFileSync (имя файла: строка, кодировка: «ascii» | «utf-8»)
Параметры
имя файла : строка
кодировка : "ascii" или "utf-8"
fs.readFileSync (имя файла: строка, кодировка: «cbor» | «json»)
Параметры
имя файла : строка
кодировка : "cbor" или "json"
renameSync ()
Переименовать файл.
fs.renameSync (oldFilename: string, newFilename: string)
Параметры
oldFilename : строка
Имя файла, который нужно переименовать.
новое Имя файла : строка
Имя, на которое следует изменить имя файла.
unlinkSync ()
Удалить файл.
fs.unlinkSync (имя файла: строка)
Параметры
имя файла : строка
Имя удаляемого файла.
statSync ()
Получить метаданные файла.
fs.statSync (имя файла: строка)
Параметры
имя файла : строка
Имя файла, метаданные которого запрашиваются.
writeSync ()
Записать буфер
в файл, указанный в fd
.
fs.writeSync (fd: number, buffer: ArrayBuffer, offset ?: number | undefined, length ?: number | undefined, position ?: number | undefined)
Параметры
fd : номер
Дескриптор файла для записи.
буфер : ArrayBuffer
Буфер, содержащий данные для записи.
(необязательно) смещение : число или не определено
Смещение в буфере
первого байта данных для записи.
(по умолчанию: 0
)
(необязательно) длина : число или не определено
Количество байтов для записи. (по умолчанию: размер буфера)
(необязательно) позиция : номер или неопределенный
Смещение от начала файла, в котором данные
должно быть написано.Если файл был открыт в режиме добавления ( a
или a +
),
этот параметр игнорируется.
readSync ()
Прочитать данные из файла, указанного в fd
.
fs.readSync (fd: number, buffer: ArrayBuffer, offset ?: number | undefined, length ?: number | undefined, position ?: number | undefined)
Параметры
fd : номер
Дескриптор файла для чтения.
буфер : ArrayBuffer
Буфер для хранения считанных данных.
(необязательно) смещение : число или не определено
Смещение в буфере
первого байта, в котором находятся данные файла
для хранения. (по умолчанию: 0
)
(необязательно) длина : число или не определено
Число байтов для чтения. (по умолчанию: размер буфера)
(необязательно) позиция : номер или неопределенный
Смещение от начала файла, из которого данные
следует читать.(по умолчанию: 0
)
closeSync ()
Закройте дескриптор файла.
fs.closeSync (fd: number)
Параметры
fd : номер
Дескриптор файла для закрытия.
openSync ()
Откройте файл.
Имена файлов представляют собой плоские имена без иерархии и не могут содержать путь
разделители (/
) или префиксы.
Имя файла — это непустая строка длиной до 64 символов
Допустимые символы для имен файлов: a
— z
, A
— Z
, 0
— 9
, !
, #
,
долларов США, %
, и
, '
, (
, )
, -
, @
, ^
, _
, {
, ~
, ~
, .
,
Зарезервированные имена .
и ..
нельзя использовать в качестве имен файлов.
fs.openSync (имя файла: строка, флаги: «r» | «r +» | «w» | «w +» | «a» | «a +»)
Параметры
имя файла : строка
Имя файла для открытия.
флаги : «r» или «r +», или «w», или «w +», или «a», или «a +»
Флаги, определяющие режим открытия файла.
-
r
: открыть файл для чтения. Выдается ошибка, если файл
не существует. -
r +
: Откройте файл для чтения и записи. Выдается ошибка, если
файл не существует. -
w
: открыть файл для записи. Файл создается, если он не
существует или усечен, если это так. -
w +
: открыть файл для чтения и записи. Файл создается, если он
не существует или усечен, если это так. -
a
: Откройте файл для добавления. Файл создается, если он не
существовать. -
a +
: Откройте файл для чтения и добавления. Файл создается, если
не существует.
listDirSync ()
Новое в SDK 2.0
Метод инициирования процесса нерекурсивного перечисления всех элементов в
данный каталог.
fs.listDirSync (путь: строка)
Параметры
путь : строка
Путь для чтения.
Интерфейс:
DirectoryIteratorResult
DirectoryIteratorResult
Недвижимость
только для чтения
выполнено
логическое
логическое значение, указывающее, закончили ли мы повторение
только чтение
значение
строка или неопределенная
имя текущей записи каталога или не определено, если выполнено, верно
Интерфейс:
DirectoryIterator
Справочник
Методы
следующая ()
Возвращает: DirectoryIteratorResult
Получить следующую запись каталога
Интерфейс:
FileStats
Метаданные файла
Недвижимость
только для чтения
mtime
Дата
Время последнего изменения данных файла.
только для чтения
размер
номер
Размер файла в байтах.
Как читать и записывать файлы JSON в Node.js
JSON (JavaScript Object Notation) — популярный формат для обмена данными между приложениями, написанными на разных языках. В приложениях Node.js JSON стал удобным выбором для хранения данных благодаря его единообразию и простоте.
Node.js предоставляет несколько встроенных модулей, упрощающих работу с данными JSON.Из этой статьи вы узнаете:
Чтение из файла JSON
Прежде чем я углублюсь в подробности чтения файла JSON, давайте сначала создадим новый файл JSON с именем databases.json
, который содержит следующие данные JSON:
database.json
[
{
"name": "MySQL",
"тип": "СУБД"
},
{
"name": "MongoDB",
"тип": "NoSQL"
},
{
"name": "Neo4j",
"тип": "БД графика"
}
]
База данных .json
— это простой файл, хранящийся на диске, который содержит массив объектов JSON. Наша цель — прочитать этот файл и распечатать записи на консоли.
Чтобы прочитать данные JSON из указанного выше файла, вы можете использовать собственный модуль fs
. Этот модуль предоставляет методы для чтения, записи и просмотра файлов, а также многие другие функции для взаимодействия с файловой системой. Поскольку это нативный модуль, вам не нужно ничего устанавливать. Просто импортируйте его в свой код, вызвав const fs = require ('fs')
.
Модуль fs
предоставляет нам два метода: fs.readFile ()
и fs.readFileSync ()
, которые можно использовать для чтения данных из файла. Обе эти функции делают одно и то же — читают файлы с диска. Единственная разница заключается в том, как эти функции выполняются на самом деле.
Прочтите файл JSON с помощью
fs.readFile ()
Метод fs.readFile ()
считывает данные из файла асинхронно. Он не блокирует выполнение цикла событий при чтении файла.Вместо этого элемент управления перемещается на следующую строку для выполнения оставшихся строк кода. Как только данные файла становятся доступными, fs.readFile ()
вызывает функцию обратного вызова, переданную ей в качестве аргумента.
Чтобы прочитать данные JSON из файла databases.json
с помощью метода fs.readFile ()
, просто передайте имя файла, необязательный тип кодировки и функцию обратного вызова для получения данных файла:
const fs = require ('fs');
фс.readFile ('./ databases.json', 'utf8', (err, data) => {
if (err) {
console.log (`Ошибка чтения файла с диска: $ {err}`);
} еще {
const базы данных = JSON.parse (данные);
database.forEach (db => {
console.log (`$ {db.name}: $ {db.type}`);
});
}
});
Int в приведенном выше примере, поскольку метод fs.readFile ()
возвращает данные в виде строки JSON, мы должны использовать JSON.parse ()
, чтобы преобразовать его в объект JSON.Наконец, мы используем цикл forEach () для печати всех баз данных на консоли.
Вот вывод вышеуказанного кода:
MySQL: СУБД
MongoDB: NoSQL
Neo4j: БД графиков
Прочтите файл JSON с помощью
fs.readFileSync ()
Метод fs.readFileSync ()
считывает данные из файла синхронно. В отличие от fs.readFile ()
, он блокирует выполнение цикла событий до тех пор, пока не будут загружены все данные из файла.
Вместо передачи метода обратного вызова вы передаете только имя файла в fs.readFileSync ()
, как показано ниже:
const fs = require ('fs');
пытаться {
const data = fs.readFileSync ('./ databases.json', 'utf8');
const базы данных = JSON.parse (данные);
database.forEach (db => {
console.log (`$ {db.name}: $ {db.type}`);
});
} catch (err) {
console.log (`Ошибка чтения файла с диска: $ {err}`);
}
Хотя fs.readFileSync ()
имеет чистый синтаксис, вы никогда не должны использовать его для чтения больших файлов, поскольку он блокирует выполнение цикла событий и может существенно повлиять на производительность приложения.Это полезно только для чтения файлов конфигурации при запуске приложения перед выполнением любых других задач.
Чтение файла JSON с помощью
require ()
Наконец, последний способ чтения файла JSON — использование глобального метода require ()
. Этот подход аналогичен тому, что вы используете для загрузки модулей Node.js, но он также работает для загрузки файлов JSON.
Все, что вам нужно сделать, это передать путь к файлу JSON методу require ()
, и он синхронно прочитает и проанализирует файл JSON и вернет объект JSON, готовый к использованию:
const databases = require ('./databases.json ');
database.forEach (db => {
console.log (`$ {db.name}: $ {db.type}`);
});
Метод require ()
работает точно так же, как fs.readFileSync ()
— синхронное чтение файла, но это глобальный метод, который можно вызывать из любого места. Более того, он автоматически анализирует содержимое файла в объект JavaScript.
Однако у использования метода require ()
есть несколько недостатков:
- Читает файл только один раз и кэширует данные; требуя его снова, просто вернув кешированные данные.
- Файл должен иметь расширение
.json
. Без правильного расширения методrequire ()
не будет рассматривать его как файл JSON.
Из-за вышеуказанных ограничений require ()
подходит только для загрузки статических файлов конфигурации, которые не часто меняются. Вместо этого для чтения динамического файла, такого как databases.json
, следует использовать метод fs.readFile ()
.
Запись в файл JSON
Прямо как фс.readFile ()
и fs.readFileSync ()
, модуль fs
предоставляет еще две функции для записи файлов данных: fs.writeFile ()
и fs.writeFileSync ()
.
Как следует из названий, метод fs.writeFileSync ()
записывает данные в файл синхронно, а fs.writeFile ()
записывает данные в файл асинхронно.
Запись в файл JSON с использованием
fs.writeFile ()
Чтобы записать JSON в файл, используя fs.writeFile ()
, просто передайте путь к файлу для записи данных, строку JSON, которую вы хотите записать, необязательный тип кодирования и функцию обратного вызова, которая будет выполняться после записи файла.
Обратите внимание, что если файл еще не существует, он будет создан; если он существует, он будет перезаписан!
Вот пример:
const fs = require ('fs');
let user = {
имя: 'Джон Доу',
emai: '[email protected]',
возраст: 27,
мужской пол',
профессия: «Разработчик программного обеспечения»
};
const data = JSON.stringify (пользователь);
fs.writeFile ('./ user.json', data, 'utf8', (err) => {
if (err) {
console.log (`Ошибка записи файла: $ {err}`);
} еще {
console.log (`Файл успешно записан!`);
}
});
В приведенном выше примере мы сохраняем объект JSON user
в файл user.json
.
Обратите внимание на использование метода JSON.stringify ()
для преобразования объекта JSON в строку JSON перед сохранением его на диск. Если вы попытаетесь записать объект в файл без предварительного преобразования его в строку, ваш файл будет пустым и будет выглядеть, как показано ниже:
[объект, объект]
Теперь, если вы выполните приведенный выше код, вы должны увидеть следующее содержимое в user.json
файл:
{"имя": "Джон Доу", "emai": "[email protected]", "возраст": 27, "пол": "Мужской", "профессия": "Разработчик программного обеспечения"}
Технически это все, что вам нужно для записи JSON в файл. Однако данные записываются в файл как одна строка.
Чтобы красиво распечатать объект JSON, измените метод JSON.stringify ()
следующим образом:
const data = JSON.stringify (пользователь, null, 4);
Теперь, если открыть user.json
, вы должны увидеть следующее содержимое:
{
"name": "Джон Доу",
"emai": "[email protected]",
«возраст»: 27,
"мужской пол",
«профессия»: «Разработчик программного обеспечения»
}
Запись в файл JSON с использованием
fs.writeFileSync ()
Наконец, последний способ записи данных в файл JSON — использование метода fs.writeFileSync ()
. Он синхронно записывает данные в файл, что означает, что он блокирует выполнение Node.js, пока файл не будет записан на диск.
Взгляните на следующий пример, в котором fs.writeFileSync ()
используется для записи объекта JSON в файл:
const fs = require ('fs');
let user = {
имя: 'Джон Доу',
emai: '[email protected]',
возраст: 27,
мужской пол',
профессия: «Разработчик программного обеспечения»
};
пытаться {
const data = JSON.stringify (пользователь, null, 4);
fs.writeFileSync ('./ user.json', data, 'utf8');
console.log (`Файл успешно записан!`);
} catch (err) {
приставка.log (`Ошибка записи файла: $ {err}`);
}
Обновление файла JSON
Теперь, когда мы узнали, как читать и записывать файлы JSON, что, если вы хотите обновить существующий файл JSON?
Мы можем комбинировать оба этих подхода, чтобы использовать наши файлы JSON как простую базу данных. Всякий раз, когда мы хотим обновить данные в файле JSON, мы можем прочитать содержимое, изменить данные и затем записать новые данные обратно в исходный файл.
Вот пример, демонстрирующий, как можно добавить еще одну запись в базы данных .json
файл:
const fs = require ('fs');
fs.readFile ('./ databases.json', 'utf8', (err, data) => {
if (err) {
console.log (`Ошибка чтения файла с диска: $ {err}`);
} еще {
const базы данных = JSON.parse (данные);
database.push ({
имя: 'Postgres',
тип: 'СУБД'
});
fs.writeFile ('./ databases.json', JSON.stringify (databases, null, 4), (err) => {
if (err) {
приставка.log (`Ошибка записи файла: $ {err}`);
}
});
}
});
Теперь, если вы выполните приведенный выше код, вы должны увидеть новую запись в databases.json
, как показано ниже:
[
{
"name": "MySQL",
"тип": "СУБД"
},
{
"name": "MongoDB",
"тип": "NoSQL"
},
{
"name": "Neo4j",
"тип": "БД графика"
},
{
"name": "Postgres",
"тип": "СУБД"
}
]
Сторонние библиотеки
Если вы не хотите вручную анализировать или преобразовывать данные JSON каждый раз при чтении или записи в файл JSON, используйте вместо этого модуль jsonfile.
Модуль jsonfile
включает в себя методы объекта fs
и JSON
и предоставляет те же методы, что и модуль fs
, для чтения и записи файлов JSON.
Введите следующую команду в корневом каталоге проекта, чтобы установить модуль jsonfile
:
$ npm установить jsonfile --save
Для чтения данных из файлов JSON модуль jsonfile
предоставляет методы readFile ()
и readFileSync ()
.Они аналогичны тем, которые предлагаются модулем fs
, за исключением того, что они автоматически анализируют содержимое файла в объект JSON:
const jsonfile = require ('jsonfile');
jsonfile.readFile ('./ databases.json', (err, databases) => {
if (err) {
console.log (`Ошибка чтения файла с диска: $ {err}`);
} еще {
database.forEach (db => {
console.log (`$ {db.name}: $ {db.type}`);
});
}
});
Аналогично, чтобы записать данные в файл JSON, вы можете использовать метод writeFile ()
или writeFileSync ()
:
const jsonfile = require ('jsonfile');
let user = {
имя: 'Джон Доу',
emai: Джон[email protected] ',
возраст: 27,
мужской пол',
профессия: «Разработчик программного обеспечения»
};
jsonfile.writeFile ('./ user.json', user, {пробелы: 4}, (err) => {
if (err) {
console.log (`Ошибка записи файла: $ {err}`);
} еще {
console.log (`Файл успешно записан!`);
}
});
Заключение
JSON — один из самых популярных типов данных, которые, как вы ожидаете, будут работать в Node.js, и возможность чтения и записи файлов JSON чрезвычайно полезна.
В этой статье мы рассмотрели различные способы чтения и записи файлов JSON, включая модуль fs
, метод require ()
и модуль jsonfile
— сторонний модуль.
Модуль fs
— это собственный модуль, который предоставляет функции как для чтения, так и для записи файлов. Методы fs.readFile ()
и fs.writeFile ()
могут использоваться для асинхронного чтения и записи данных в файлы JSON. Для синхронного взаимодействия с файловой системой доступны методов fs.readFileSync ()
и fs.writeFileSync ()
.
Вы также можете использовать глобальный метод require ()
для синхронного чтения и анализа файла JSON при запуске.Однако он кэширует только данные файла и может использоваться только для чтения файлов с расширением .json
.
Если вы хотите узнать больше, посмотрите, что такое JSON на самом деле, и как вы можете читать и записывать объект JSON в файл в Node.js.
✌️ Понравилась статья? Следуй за мной на
Твиттер
и LinkedIn.
Вы также можете подписаться на
Новостная лента.
Модульное тестирование Node.js fs с использованием mock-fs · Эмма Гото
Если вы используете модуль fs для таких вещей, как запись в файлы или изменение имен файлов, вы, возможно, задались вопросом — как это выполнить модульное тестирование?
В этом посте я покажу вам, как можно использовать mock-fs для простого модульного тестирования вашего Node.js скрипты.
Если вы хотите узнать больше о Node.js, ознакомьтесь с моими сообщениями об автоматизации переименования файлов с помощью Node.js и записи в файлы с помощью Node.js.
Настройте ваш скрипт Node.js для тестирования
Для начала мы будем использовать пример скрипта Node.js, который использует fs для замены строки «Hello» на «Goodbye».
Этот пример является полностью синхронным и использует только fs readFileSync
и writeFileSync
:
const {readFileSync, writeFileSync} = require ('fs');
const modifyFile = () => {
const file = `$ {process.cwd ()} / имя_папки / index.md`
const content = readFileSync (файл, 'utf8'); const newContent = content.replace («Привет», «До свидания»);
writeFileSync (файл, newContent);};
Если ваш сценарий полностью синхронизирован, у вас не будет проблем, и вы можете продолжать прокрутку до части mock-fs ниже.
Однако, если вы используете асинхронные функции, такие как fs readFile
или writeFile
, вам необходимо убедиться, что ваш скрипт завершил до того, как начнет модульные тесты.
Мы можем сделать это с помощью fs Promises API.
Использование fs Promises API
Вместо использования readFile
используйте promises.readFile
, и вы вернете обещание:
const {promises} = require ('fs');
const modifyFile = async () => {
const file = `$ {process.cwd ()} / имя_папки / index.md`
return promises.readFile (file, 'utf8'). then (content => {const newContent = content.replace ('Привет', 'До свидания')
верните обещания.writeFile (файл, newContent); });
};
Это означает, что теперь в модульном тесте вы можете использовать await
и убедиться, что ваш скрипт завершен перед его тестированием:
test ('следует заменить Hello на Goodbye', async () => {
ждать modifyFile ();
Однако, прежде чем делать какие-либо утверждения, нам также нужно добавить несколько имитаторов.
Макет ваших файлов и папок с помощью mock-fs
Мы хотим иметь возможность имитировать некоторые файлы, потому что в противном случае вам понадобятся фиктивные тестовые файлы, которые находятся в вашей тестовой папке, и вам также потребуется сбросить их в исходное состояние в конце каждого модульного теста.
С помощью mock-fs мы можем имитировать структуру папок и содержимое файлов.
Сначала убедитесь, что он установлен:
npm i mock-fs -D
yarn add mock-fs -D
Затем добавьте его к крючку beforeAll
в вашем тесте:
import mock from 'mock-fs';
import {main} из './modifyFile';
describe ('modifyFile script', () => {
beforeAll (() => {
насмехаться({
'имя папки': {
'index.md': '# Привет, мир!',
},
});
});
afterAll (() => {
насмехаться.восстановить();
});
Эти имена папок относятся к корню вашего репозитория. Здесь мы имитируем структуру папок / файлов следующим образом:
Напишите модульный тест на модификацию файла с помощью mock-fs
Теперь мы можем продолжить наш модульный тест. Мы можем утверждать по содержимому файла:
test ('следует заменить привет на прощание', async () => {
const file = `$ {process.cwd ()} / имя_папки / index.md`
const expectedResult = `# Прощай, мир`;
ждать modifyFile ();
const result = readFileSync (файл, 'utf8');
ожидать (результат).toEqual (ожидаемый результат);
});
Когда мы вызываем modifyFile
, мы будем изменять фиктивный файл. Затем мы можем подтвердить, что файл был успешно изменен, используя readFileSync
для его чтения.
Напишите модульный тест переименования файлов с помощью mock-fs
В случае, если мы хотим провести модульный тест переименования файлов, мы можем сделать следующее:
import glob from 'glob';
test ('следует успешно перемещать и переименовывать файлы', async () => {
const expectedFiles = [
`$ {process.cwd ()} / folderName / renamedFile.md`,
];
ждать modifyFile ();
const files = glob.sync (`$ {process.cwd ()} / имя_папки / *. md`);
ожидать (файлы) .toEqual (ожидаемые файлы);
});
Поскольку мы использовали mock-fs, ваш скрипт также может переименовывать имитированные файлы. Затем мы можем использовать glob
, чтобы убедиться, что наши файлы были переименованы должным образом.
фс | Модули JavaScript | Приложение | Руководство
const fs = требуется ('fs')
Реализация пытается следовать CommonJS
Файловая система / A / 0
спецификация, где это возможно.
Рабочий каталог
Приведенные ниже функции каталога не должны использовать текущий рабочий каталог сервера, например .
или . / Тест
.
Вы не сможете определить, разрешает ли среда, в которой работает сервер, список каталогов,
чтение или запись файлов.
Вы должны либо основывать свои каталоги с помощью getTempPath ()
, либо в качестве службы Foxx использовать
module.context.basePath.
Манипуляции с каталогом с одним файлом
существует
проверяет, существует ли файл любого типа или каталога
фс.существует (путь)
Возвращает истину, если файл (любого типа) или каталог существует в заданном
дорожка. Если файл является неработающей символической ссылкой, возвращает false.
isFile
проверяет, является ли путь файлом
fs.isFile (путь)
Возвращает истину, если путь указывает на файл.
— это каталог
проверяет, является ли путь каталогом
fs.isDirectory (путь)
Возвращает истину, если путь указывает на каталог.
размер
получает размер файла
fs.size (путь)
Возвращает размер файла, указанного в пути .
mtime
получает время последней модификации файла
fs.mtime (имя файла)
Возвращает дату последнего изменения указанного файла. Дата
возвращается как отметка времени Unix (количество секунд, прошедших с 1 января 1970 г.).
разделитель пути
fs.path Разделитель
Если вы хотите объединить два пути, вы можете использовать fs.pathSeparator вместо /
или \
.
присоединиться
fs.join (путь, имя файла)
Функция возвращает комбинацию пути и имени файла, например
fs.join ('folder', 'file.ext')
вернет folder / file.ext
.
getTempFile
возвращает имя (нового) временного файла
fs.getTempFile (каталог, createFile)
Возвращает имя нового временного файла в каталоге в каталоге .Если createFile равно true , будет создан пустой файл, поэтому никакие другие
процесс может создать файл с таким же именем.
Примечание : каталог каталог должен существовать.
getTempPath
возвращает временный каталог
fs.getTempPath ()
Возвращает абсолютный путь к временному каталогу
маркаAbsolute
делает заданный путь абсолютным
fs.makeAbsolute (путь)
Возвращает заданную строку, если это абсолютный путь, в противном случае
возвращается абсолютный путь к тому же местоположению.
chmod
устанавливает права доступа к файлам для указанных файлов (не только для Windows).
fs.chmod (путь, режим)
, где mode
— это строка с начальным нулем, соответствующая OCTAL-MODE
, как объяснено
в * nix человек chmod
.
Возвращает истину в случае успеха.
список
возвращает список каталогов
fs.list (путь)
Функция возвращает имена всех файлов в каталоге в
лексически отсортированный порядок.Выдает исключение, если каталог не может быть
пройден (или путь не является каталогом).
Примечание : это означает, что список («x») каталога, содержащий «a» и «b», будет
return [«a», «b»], а не [«x / a», «x / b»].
listTree
возвращает дерево каталогов
fs.listTree (путь)
Функция возвращает массив, который начинается с заданного пути, и все
пути относительно данного пути, обнаруженные обходом в глубину
каждого каталога в любом посещенном каталоге, сообщая, но не просматривая
символические ссылки на каталоги.Первый путь всегда ""
, путь
относительно себя.
makeDirectory
создает каталог
fs.makeDirectory (путь)
Создает каталог, указанный в , путь .
makeDirectoryRecursive
создает каталог
fs.makeDirectoryRecursive (путь)
Создает иерархию каталогов, указанную путем .
удалить
удаляет файл
фс.удалить (имя файла)
Удаляет файл имя файла по заданному пути. Выдает исключение, если
path соответствует всему, что не является файлом или символической ссылкой. Если
«Путь» относится к символической ссылке, удаляет символическую ссылку.
removeDirectory
удаляет пустой каталог
fs.removeDirectory (путь)
Удаляет каталог, если он пуст. Выдает исключение, если путь не
пустой каталог.
removeDirectoryRecursive
удаляет каталог
фс.removeDirectoryRecursive (путь)
Удаляет каталог со всеми подэлементами. Выдает исключение, если путь
это не каталог.
Файл IO
читать
читает в файл
fs.read (имя файла)
Считывает файл и возвращает содержимое в виде строки. Обратите внимание, что
содержимое файла должно быть в кодировке UTF-8.
читать64
читает файл как base64
fs.read64 (имя файла)
Считывает файл и возвращает содержимое в виде строки.Содержимое файла
В кодировке Base64.
читать Буфер
читает в файл
fs.readBuffer (имя файла)
Считывает файл и возвращает его содержимое в объекте Buffer.
читатьFileSync
fs.readFileSync (имя файла, кодировка)
Считывает содержимое файла, указанного в , имя файла
. Если указано кодировка
,
содержимое файла будет возвращено в виде строки. Поддерживаемые кодировки:
-
utf8
илиutf-8
-
ascii
-
base64
-
ucs2
илиucs-2
-
utf16le
илиutf16be
-
шестигранник
Если кодировка
не указана, содержимое файла будет возвращено в буфере.
объект.
написать
fs.write (имя файла, содержимое)
Записывает содержимое в файл. Контент может быть строкой или буфером
объект. Если файл уже существует, он обрезается.
writeFileSync
fs.writeFileSync (имя файла, содержимое)
Это псевдоним для fs.write (имя файла, содержимое)
.
добавить
fs.append (имя файла, содержание)
Записывает содержимое в файл.Контент может быть строкой или буфером
объект. Если файл уже существует, содержимое добавляется в
конец.
Рекурсивные манипуляции
copyRecursive
копирует структуру каталогов
fs.copyRecursive (источник, место назначения)
Копирует исходный в пункт назначения .
Будут выброшены исключения:
- Ошибка копирования файла
- указание каталога для назначения, когда источником является файл
- с указанием каталога в качестве источника и назначения
Копировать файл
копирует файл в целевой файл
фс.copyFile (источник, место назначения)
Копирует из источника в место назначения. Если место назначения — это каталог, файл
с таким же именем будет создана в этом каталоге, иначе копия получит
в
указанное имя файла.
ссылка Файл
создает символическую ссылку из цели вместо пути ссылки.
fs.linkFile (цель, путь ссылки)
В пути linkpath
будет создана символическая ссылка на target
.
переместить
переименовывает файл
фс.перемещение (источник, место назначения)
Перемещает источник к месту назначения. Невозможность переместить файл или
указание каталога для назначения, когда источником является файл, вызовет
исключение. Аналогичным образом, указание каталога в качестве источника и назначения приведет к
неудача.
ZIP
распаковать файл
распаковывает файл
fs.unzipFile (имя файла, исходящий путь, skipPaths, перезапись, пароль)
Распаковывает zip-файл, указанный в имя_файла , в путь, указанный в
выезд .Перезаписывает любые существующие целевые файлы, если установлено значение overwrite
к правда .
Возвращает true , если файл был успешно разархивирован.
zip Файл
архивирует файл
fs.zipFile (имя файла, chdir, файлы, пароль)
Сохраняет файлы, указанные в файлах , в zip-файле имя файла . Если
файл имя файла уже существует, возникает ошибка. Список ввода
файлы файлы должны быть указаны в виде списка абсолютных имен файлов.Если chdir — это
не пусто, префикс chdir будет удален из имени файла в
zip, поэтому в распакованном виде имена файлов будут относительными.
Указывать пароль необязательно.
Возвращает true , если файл был успешно заархивирован.
Прочитать файл json в Node.js
Чтобы прочитать любой файл в Node.js, вам необходимо импортировать fs
или модуль файловой системы.Оттуда у вас есть два метода на выбор: readFile
и readFileSync
.
Оба аналогичны тем, что возвращают буфер двоичных данных из файла. readFile
принимает обратный вызов, который получит буфер, а readFileSync
возвращает его синхронно.
В действии они выглядят так:
const fs = require ('fs') fs.readFile ('./ data.json', (error, data) => (
error? Console.error (error): console.log (данные)
))
попробуйте {
console.log (fs.readFileSync ('./ data.json'))
} catch (error) {
console.error (error)
}
Если вы запустите этот код в каталоге с файлом data.json
, оба метода будут регистрировать что-то вроде:
<Буфер 7b 0a 20 20 22 64 61 74 61 22 3a 20 74 72 75 65 0a 7d>
Оба возвращают одни и те же данные, но они не расходуются. В большинстве случаев вам потребуется выполнить еще одну операцию, чтобы использовать данные, которые вы прочитали из файла.
Поскольку мы работаем с файлом json, мы можем использовать глобальный объект JSON
для чтения данных. Метод parse
преобразует этот буфер в пригодный для использования объект JSON:
const fs = require ('fs')
fs.readFile ('./ data.json', (error, data) => (
error? Console.error (error): console.log (JSON. parse (data))
))
попробуйте {
console.log (JSON.parse (fs.readFileSync ('./ data.json')))
} catch (error) {
console.ошибка (ошибка)
}
Запустите его еще раз, и вы увидите, что все данные, которые вы сохранили в своем json-файле, занесены в консоль. Вы успешно прочитали json-файл в Node.js!
Здесь вы можете увидеть код в действии:
Удачного кодирования!
Неемия 8: 3
(ЦУР)
.