browserify / brfs

browserify fs.readFileSync() static asset inliner
MIT License
563 stars 68 forks source link

Error combining with 6to5ify #39

Open akulapid opened 9 years ago

akulapid commented 9 years ago

I'm trying to do a brfs transform after 6to5ify, but get the following error.

browserify()
    .require("main", { entry: true })
    .transform(6to5ify)
    .transform(brfs)
    .bundle()
    .pipe(fs.createWriteStream(path.join('app.js')));
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: tried to statically call { readFile: [Function: readFile], readFileSync: [Function: readFileSync], readdir: [Function: readdir], readdirSync: [Function: readdirSync] } as a function while parsing file: /Users/akula/foo/main.js while parsing file: /Users/akula/foo/main.js
    at error (/Users/akula/foo/node_modules/brfs/node_modules/static-module/index.js:71:49)
    at traverse (/Users/akula/foo/node_modules/brfs/node_modules/static-module/index.js:247:24)
    at walk (/Users/akula/foo/node_modules/brfs/node_modules/static-module/index.js:216:13)
    at walk (/Users/akula/foo/node_modules/brfs/node_modules/static-module/node_modules/falafel/index.js:60:9)
    at /Users/akula/foo/node_modules/brfs/node_modules/static-module/node_modules/falafel/index.js:51:25
    at Array.forEach (native)
    at forEach (/Users/akula/foo/node_modules/brfs/node_modules/static-module/node_modules/falafel/index.js:8:31)
    at /Users/akula/foo/node_modules/brfs/node_modules/static-module/node_modules/falafel/index.js:49:17
    at Array.forEach (native)
    at forEach (/Users/akula/foo/node_modules/brfs/node_modules/static-module/node_modules/falafel/index.js:8:31)

btw, there's a double "while parsing file" in the message.

My main.js looks like this.

import fs from 'fs';

var foo = fs.readFileSync(__dirname + '/foo.html');
console.log(foo.toString());

If I change the import to a require and don't do 6to5ify it works fine, but together it gives the error.

erykpiast commented 9 years ago

Ack! The same problem with 6to5@3.1.2 and brfs@1.3.0 on Node@0.10.25 for Linux.

erykpiast commented 9 years ago

But it works perfectly fine when used like

var fs = require('fs');
var content = fs.readFileSync(__dirname + '/file', 'utf8');

I don't have to disable 6to5.

vegetableman commented 9 years ago

Faced this problem as well.

danharper commented 9 years ago

I'm guessing this is down to how Babel (was: 6to5) transpiles ES6 imports. This:

import fs from 'fs'

Becomes this:

var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };

var fs = _interopRequire(require("fs"));

If you want to go this route, resorting to a regular require call works fine:

var fs = require('fs');
nicroto commented 9 years ago

Just hit that, too.

lambdabaa commented 9 years ago

agh

dustinmoorenet commented 9 years ago

:+1:

ghost commented 9 years ago

I think this could be handled upstream in static-module adding support for ES6 imports (not as much of a problem adding them here than to browserify itself since the node semantics haven't been hammered out). But then brfs should come before 6to5ify/babelify in the transform list.

revolunet commented 9 years ago

looks like static-module has been updated with ES6 support ? https://github.com/substack/static-module/commit/2eb7ce0d8d42176e1537fd034be2946b9db0920c

jedrichards commented 9 years ago

I'm using brfs 1.4.1 which pulls in static-module 1.1.3 and still can't get brfs to work happily with ES6/babelify. Using same workaround as others for the moment, var fs = require('fs').

tomek-he-him commented 9 years ago

@jedrichards after some time using import for importing CommonJS modules I realized it’s really a kind of hack. fs is a CommonJS module and const fs = require('fs') seems the right thing to do to me.

import is intended for real modules which use export for exporting things. And fs is not one of these yet.

txwizard commented 6 years ago

Tou say "import is intended for real modules which use export for exporting things. And fs is not one of these yet."

Over the last few days, I have created and imported modules that use both the module.exports and the plain export idiom. I have working modules that import one of each.

Mixed_Imports.zip contains GridProperties.js, which imports both CommonConstants.js, which uses the plain export idiom, and PropertyDisplayHelpers.js, which uses the module.exports idiom.