我对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?或者我在思想上犯了一些重大错误?
非常感谢,
克里斯
答案 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 2
和electron
(它还涉及本地图书馆)。
我遇到了很多与您类似的问题,特别是从node.js
应用程序访问electron
模块的问题。
可能值得用它作为起点,而不是试图从头开始编写所有东西。
至于您的问题,您应该使用System._nodeRequire('fs')
代替require('fs')
,因为SystemJS
查找机制与node
的查找机制略有不同。
答案 2 :(得分:2)
让我引用meltedspark's answer一个类似的问题:
System.js
会覆盖Node.js
的{{1}}方法并使用它自己的解析机制。
以下是我对此问题的解决方案:
为您要使用的每个require
模块创建重新导出:
Node.js
让// 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
像往常一样在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};