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

How to browserify node `fs.readFileSync` to make it work in Chrome/Safari/IE?

我有一个 node 模块,它使用依赖于 fs 的模块,例如使用 fs.readFileSync 等。我无法手动删除这些依赖项,因为它们处于第 2 级或第 3 级具有 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 I 运行 babel 之后 Safari 没有完全符合 ES5 strict mode 并且它还负责arrow operatorlet 以及 const 不支持使用此脚本:

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 中使用 MacGapEl Capitan 上测试 WebView 客户端代码。

如何在构建时摆脱它?

我遇到了类似的问题。

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

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