2013-05-19 15 views
22

Stavo cercando di utilizzare browserify su un file che utilizza l'oggetto fs. Quando lo browserifico, la chiamata a require('fs') non viene trasformata e require restituisce {}.Browserify with require ('fs')

C'è qualche soluzione per questo? Ho visto alcuni suggerimenti su Stackoverlow e altrove, ma nessuno sembra essere pienamente realizzato.

In realtà speravo di creare un'applicazione google Web Pack utilizzando browserify per una lezione che insegno.

Grazie in anticipo.

risposta

6

Quale file deve utilizzare il browser in quel momento? Il filesystem HTML5 non è realmente paragonabile a un filesystem tradizionale. Non ha collegamenti simbolici ed è accessibile in modo asincrono solo dai Web Worker.

Quindi la risposta è: Scrivi tu stesso un livello di astrazione che può fare affidamento sul modulo fs durante l'esecuzione in Node.js e l'API HTML5 FS quando è in esecuzione nel browser. Le differenze sono troppo grandi per consentire a browserify di tradurre per te.

+3

Credo che mi sarei aspettato almeno che browserify avrebbe lasciato un commento nel codice browserified che indica che non supporta il modulo fs. –

+0

Probabilmente qui non è appropriato un "livello di astrazione", ma un'implementazione di FileReader ecc. In node.js potrebbe essere (come parte di browserify).
Ad ogni modo, sono felice di sapere che la trasformazione mancante è una funzionalità e non un "bug" da parte mia. –

41

Se si vuole inline il contenuto dei file da fs.readFileSync() chiamate, è possibile utilizzare brfs:

var fs = require('fs'); 
var src = fs.readFileSync(__dirname + '/file.txt'); 

poi fare:

browserify -t brfs main.js > bundle.js 

e src verrà impostato il contenuto di file.txt in fase di compilazione .

+0

Idea interessante, ma non soddisfa i miei bisogni. –

14

Se si desidera eseguire il file system con browserify, è possibile installare npm.

npm install browserify-fs 

ed è possibile accedere all'oggetto fs sul lato client.
Grazie

+1

Ho effettivamente installato browserify-fs e richiesto ma ho ancora lo stesso errore chiamato "fs.readFileSync non è una funzione" – Preprocezzor

0

Per tutti quelli di Google, ho avuto molta più fortuna con la trasformazione stringify.

https://github.com/JohnPostlethwait/stringify

Le risposte qui erano frustrante (anche se non sgradito) Sto importando modelli come stringhe nei miei componenti per risparmiare sul HTTP richieste comprato circa da templateUrl e tenerli fuori dei file Javascript.

Per qualche motivo, brfs non funziona bene con Babele e ha un sacco di avvertimenti per funzionare.

Non ho potuto ottenere browserify-fs per funzionare affatto.

Tuttavia, dopo aver trovato la trasformazione stringify era semplice come.

import template from '../template.html' 

const definition = { template } 

component.directive('myDirective',() => definition) 

tradotto per gli utenti ES5:

var template = require('../template.html') 

component.directive('myDirective', function() { 
    return { 
     template: template 
    } 
}) 
Problemi correlati