【问题标题】:Browserify with require('fs')使用 require('fs') 进行浏览器化
【发布时间】:2013-05-14 11:01:51
【问题描述】:

我试图在使用 fs 对象的文件上使用 browserify。当我浏览它时,对require('fs') 的调用不会被转换并且require 返回{}

有什么解决方法吗?我在 stackoverlow 和其他地方看到了一些建议,但似乎都没有完全实现。

我实际上希望为我教授的课程创建一个使用 browserify 的 google web 打包应用程序。

提前致谢。

【问题讨论】:

    标签: html node.js require html5-filesystem browserify


    【解决方案1】:

    你是否需要使用 require (fs) ,你总是可以使用 html5 文件阅读器 api 来读取 javascript 中的文件。

    window.onload = function() {
        var fileInput1 = document.getElementById('fileInput');
        if (fileInput1){
            fileInput1.addEventListener('change', function(e) {
                var file = fileInput1.files[0];
                var textType = /text.*/;
    
                if (file.type.match(textType)) {
                    var reader = new FileReader();
                    reader.onload = function(e) {
                        console.log(reader.result);
                      }    
                    reader.readAsText(file);                    
                } 
            });
        }
    }
    

    您还必须在 html 端插入一个输入文件。

    【讨论】:

      【解决方案2】:

      对于 Google 上的任何人,我在 stringify 转换方面的运气要好得多。

      https://github.com/JohnPostlethwait/stringify

      这里的答案令人沮丧(虽然不是不受欢迎)我将模板作为字符串导入到我的组件中,以节省 templateUrl 购买的 HTTP 请求并将它们排除在 Javascript 文件之外。

      由于某种原因,brfs 不能很好地与 babel 配合使用,并且有很多注意事项要开始工作。

      我根本无法让browserify-fs 工作。

      但是,在找到 stringify 转换后,它就这么简单。

      import template from '../template.html'
      
      const definition = { template }
      
      component.directive('myDirective', () => definition)
      

      为 ES5 用户翻译:

      var template = require('../template.html')
      
      component.directive('myDirective', function() {
          return {
              template: template
          }
      })
      

      【讨论】:

        【解决方案3】:

        如果你想用 browserify 运行文件系统,你可以安装 npm。

        npm install browserify-fs 
        

        您可以在客户端访问 fs 对象。
        谢谢

        【讨论】:

        • 我实际上安装了 browserify-fs 并需要它,但我仍然得到同样的错误,称为“fs.readFileSync 不是函数”
        【解决方案4】:

        如果你想内联来自fs.readFileSync()调用的文件内容,你可以使用brfs

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

        然后做:

        browserify -t brfs main.js > bundle.js
        

        并且src 将在编译时设置为file.txt 的内容。

        【讨论】:

        • 有趣的想法,但不符合我的需求。
        【解决方案5】:

        那么浏览器应该使用哪个文件系统? HTML5 文件系统无法与传统文件系统相比。它没有符号链接,只能在 Web Worker 之外异步访问。

        所以答案是:自己编写一个抽象层,在 Node.js 中运行时可以依赖 fs 模块,在浏览器中运行时可以依赖 HTML5 FS API。差异太大,无法让 browserify 为您翻译。

        【讨论】:

        • 我想我至少希望 browserify 会在 browserified 代码中留下注释,表明它不支持 fs 模块。
        • 这里可能不适合使用“抽象层”,但 node.js 中 FileReader 等的实现可能是(作为 browserify 的一部分)。
          无论如何,我很高兴知道缺少的转换是一个功能,而不是我的“错误”。
        猜你喜欢
        • 2013-11-13
        • 2023-02-19
        • 2017-03-05
        • 2016-04-05
        • 2018-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        相关资源
        最近更新 更多