我有一个node模块,该模块使用依赖于fs的模块,例如利用fs.readFileSync等。由于处于根模块级别0的软件包依赖项的第2或第3层,因此我无法手动删除这些依赖项。

鉴于,
我必须在浏览器中运行这些模块,因此我尝试了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中使用MacGapWebView上测试El Capitan客户端代码。

如何在构建时摆脱这种情况?

最佳答案

我有一个类似的问题。

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

我用不依赖file-loadermime代替了它,因此不依赖fs。确保卸载url-loader,因为它仍然会引发错误!

关于javascript - 如何浏览器 Node fs.readFileSync以使其在Chrome/Safari/IE中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38546141/

10-12 00:17
查看更多