电子,Angular2,“fs”

时间:2016-04-16 11:20:54

标签: typescript angular electron

我对Angular,Javascript等主题很新。

我尝试编写一个应该访问文件系统的(TypeScript)Angular2-Electron应用程序。每个人都说要求“fs”模块,一切都很好,但这对我不起作用......

如果我这样做:var fs = require('fs');

我可以看到我的应用尝试从我的应用根文件夹加载“fs”模块: ..myapp / dist / fs net :: ERR_FILE_NOT_FOUND

我在index.html中引用了所有其他外部模块:

    <!-- build:js app/scripts/combined.js -->
    <script src="../node_modules/jquery/dist/jquery.js"></script>
    <script src="../node_modules/angular2/bundles/angular2-polyfills.js"></script>
    <script src="../node_modules/systemjs/dist/system.js"></script>
    <script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
    <script src="../node_modules/angular2/bundles/http.js"></script>
    <script src="../node_modules/angular2/bundles/router.js"></script>
    <script src="../node_modules/rxjs/bundles/Rx.js"></script>
    <script src="../node_modules/bootstrap/dist/js/bootstrap.js"></script>
    <script src="../node_modules/pdfjs-dist/build/pdf.combined.js"></script>
    <script src="boot.js" type="text/javascript"></script>
    <!-- endbuild -->

因此我认为可以找到它们,但“fs”属于电子中存在的node.js?或者我在思想上犯了一些重大错误?

非常感谢,
克里斯

4 个答案:

答案 0 :(得分:4)

问题似乎是我在Angular应用程序中使用SystemJS。 SystemJS尝试从我自己的应用程序加载模块。

我现在添加了这个,所以我的index.html似乎有效:

    <script>
    if (require) {
        window.$ = window.jQuery = require('./app/assets/js/jquery.min.js');
        window.fs = require('fs');
        window.path = require('path');
    }
</script>

答案 1 :(得分:3)

我管理的是github project,其中涵盖的不仅仅是Angular 2electron(它还涉及本地图书馆)。
我遇到了很多与您类似的问题,特别是从node.js应用程序访问electron模块的问题。
可能值得用它作为起点,而不是试图从头开始编写所有东西。

至于您的问题,您应该使用System._nodeRequire('fs')代替require('fs'),因为SystemJS查找机制与node的查找机制略有不同。

答案 2 :(得分:2)

让我引用meltedspark's answer一个类似的问题:

  

System.js会覆盖Node.js的{​​{1}}方法并使用它自己的解析机制。

以下是我对此问题的解决方案:

  1. 为您要使用的每个require模块创建重新导出:

    Node.js
  2. // scripts/node-re-exports/fs.ts declare const System: any; const fs = System._nodeRequire('fs'); export = fs; // scripts/node-re-exports/electron.ts declare const System: any; const electron = System._nodeRequire('electron'); export = electron; 知道在哪里搜索这些转口。

    systemjs.config.js
  3. 像往常一样在Angular2组件中导入这些模块:

    map: {
      ...
    
      // Re-exports of Node.js modules.
      fs: 'compiled/node-re-exports/fs.js',
      electron: 'compiled/node-re-exports/electron.js'
    }
    

答案 3 :(得分:1)

在systemjs地图中使用“fs”:“@ node / fs”可以完全解决问题。 然后您可以照常导入本机节点模块:

从'fs'导入{existsSync};