requer arquivo como string

99

Estou usando o node + express e estou me perguntando como posso importar qualquer arquivo como uma string. Vamos dizer que eu tenho um arquivo txt e tudo que eu quero é carregá-lo em uma variável como tal.

var string = require("words.txt");

Eu sou contra

modules.exports = function(){

    var string = "whatever";

    return string;

}
ThomasReggi
fonte
1
Não é uma resposta, mas evita a criação de uma função: const { string } = require('words.js');where words.jscontémmodule.exports = { string: 'whatever' };
Dem Pilafian

Respostas:

127

Se for para uma (algumas) extensões específicas, você pode adicionar seu próprio require.extensionsmanipulador:

var fs = require('fs');

require.extensions['.txt'] = function (module, filename) {
    module.exports = fs.readFileSync(filename, 'utf8');
};

var words = require("./words.txt");

console.log(typeof words); // string

Caso contrário, você pode misturar fs.readFilecom require.resolve:

var fs = require('fs');

function readModuleFile(path, callback) {
    try {
        var filename = require.resolve(path);
        fs.readFile(filename, 'utf8', callback);
    } catch (e) {
        callback(e);
    }
}

readModuleFile('./words.txt', function (err, words) {
    console.log(words);
});
Jonathan Lonowski
fonte
51
require.extensions agora está obsoleto para qualquer pessoa que encontrar esta postagem. nodejs.org/api/globals.html#globals_require_extensions
blockloop
2
Deprecated in the pastmasSince the module system is locked, this feature will probably never go away. However, it may have subtle bugs and complexities that are best left untouched.
loretoparisi
10
Embora esteja de fato obsoleto, existe alguma boa alternativa? (que estende exigir, quero dizer)
juandemarco
31

Para ler o arquivo CSS em String, use este código. Funciona para .txt.

const fs = require('fs')
const path = require('path')

const css = fs.readFileSync(path.resolve(__dirname, 'email.css'), 'utf8')

ES6:

import fs from 'fs'
import path from 'path'

let css = fs.readFileSync(path.resolve(__dirname, 'email.css'), 'utf8')
Max Ma
fonte
2
Como posso fazer isso para um arquivo html? Eu tenho um arquivo html em um diretório irmão que preciso ler e carregar como uma string no cheerio?
lopezdp
0

você pode exigir arquivos .json, tanto com node.js quanto TypeScript. Esse é o único formato que suporta ser obrigatório () adequado para serializar texto. Você pode usar uma ferramenta de tempo de compilação para compactar seus arquivos em um json, como https://github.com/cancerberoSgx/fs-to-json

cancerbero
fonte
0

A resposta selecionada está obsoleta e não é mais recomendada . A documentação do NodeJS sugere outras abordagens, como:

carregar módulos por meio de algum outro programa Node.js.

mas não se expande mais.

  • Você pode usar uma biblioteca muito simples como esta: require-text

  • Ou implemente você mesmo (como no pacote acima:)

    var fs = require('fs');
    module.exports = function(name, require) {
       return fs.readFileSync(require.resolve(name)).toString();
    };
    
mim
fonte