如何浏览节点`fs.readFileSync`以使其在Chrome / Safari / IE中运行?

时间:2016-07-23 20:28:55

标签: javascript node.js webpack browserify

我有一个node模块,它使用依赖于fs的模块,比如使用fs.readFileSync等。我无法手动删除这些依赖项,因为它们位于包的第二级或第三级具有0级我的根模块的依赖项。

鉴于此, 我必须在浏览器中运行这些模块,因此我尝试了browserifywebpack。 我的webpack配置如下

var path = require('path');
var webpack = require("webpack");

module.exports = {
  entry: './pgapi',
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  module: {
    noParse: /node_modules\/json-schema\/lib\/validate\.js/,
    loaders: [
      { test: /\.json$/, loader: 'json-loader' }
      , {
          test: /\.js$/,
          loader: "transform?brfs"
        }
    ]
  },
  resolve: {
    extensions: ['', '.webpack.js', '.web.js', '.js']
  },
  node: {
    console: true,
    fs: 'empty',
    net: 'empty',
    tls: 'empty'
  },
  plugins: [
        //new webpack.optimize.UglifyJsPlugin(),
        //new webpack.optimize.DedupePlugin(),
        new webpack.DefinePlugin({
            __DEV__: true
        })
    ]
};

并且我使用browserify替代brfs转换来尝试照顾fs.readFileSync等。

构建bundle.js之后我运行babel,因为Safari时没有完全符合ES5 strict mode,并且它会照顾arrow operator以及使用此脚本不支持的letconst

var fs = require('fs')
var args = process.argv.slice(2);
var code=fs.readFileSync(args[0])
var res=require("babel-core").transform(code, {
  plugins: [
     "transform-es2015-arrow-functions",
     "transform-es2015-constants",
     "transform-es2015-block-scoping"]
});
console.log(res.code)

所以我喜欢 $ webpack$ browserify mymodule.js -o dist/bundle.js -t brfs

然后在dist/bundle.js

$ node babelify.js dist/bundle.js > out.js

然后会发生ReferenceError: Can't find variable: fs(参见here) 这似乎是因为brsf转换对静态表达式eval有效,因此它不能理解fs.readFileSync(varname)中的变量。 我在Xcode中使用MacGap测试WebView上的El Capitan客户端代码。

如何在构建时摆脱这个?

1 个答案:

答案 0 :(得分:1)

我有类似的问题。

确定哪个模块正在调用mime并找到替代模块。对我来说,这是url-loader,取决于mime

我将其替换为file-loader,它不依赖于mime,因此不依赖于fs。确保卸载url-loader,因为它仍然会抛出错误!