Update to Angular v6 - Module not found: Error: Can't resolve 'fs'

前端 未结 12 2473
栀梦
栀梦 2020-11-30 06:04

I\'m trying to migrate my Angular Universal project from Angular v5 to v6

I\'ve got a service where I use fs to load the translation on the server side.

12条回答
  •  伪装坚强ぢ
    2020-11-30 06:14

    For anyone still looking for an answer, here's how I managed to require('fs') in my angular 7 app. Or for that matter, any other node module.

    Versions

    Angular CLI: 7.0.4
    Node: 10.13.0
    OS: win32 x64
    "@angular/animations": "~7.0.0",
    "@angular/common": "~7.0.0",
    "@angular/compiler": "~7.0.0",
    "@angular/core": "~7.0.0",
    "@angular/forms": "~7.0.0",
    "@angular/http": "~7.0.0",
    "@angular/platform-browser": "~7.0.0",
    "@angular/platform-browser-dynamic": "~7.0.0",
    "@angular/router": "~7.0.0",
    "@angular-devkit/build-angular": "~0.10.0",
    "@angular/cli": "~7.0.4",
    "@angular/compiler-cli": "~7.0.0",
    "@angular/language-service": "~7.0.0",
    "electron": "^3.0.7",
    "typescript": "~3.1.1"
    

    1. Install @types/node

    npm install --save-dev @types/node

    2. Modify tsconfig.json

    Take note of "allowSyntheticDefaultImports" flag. It must be set to true.

    {
      "compileOnSave": false,
      "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "baseUrl": "./",
        "outDir": "./dist/out-tsc",
        "sourceMap": true,
        "declaration": false,
        "module": "es2015",
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "target": "es5",
        "types": [
          "node"
        ],
        "typeRoots": [
          "node_modules/@types"
        ],
        "lib": [
          "es2018",
          "dom"
        ],
        "strict": false
      }
    }
    

    3. Require fs

    import { Component } from '@angular/core';
    import { } from 'electron';
    import Fs from 'fs';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.scss']
    })
    export class AppComponent {
    
      constructor() {
        //check if platform is electron
        let isElectron: boolean = window && window['process'] && window['process'].type;
    
        if (isElectron) {
          let fs: typeof Fs = window['require']('fs');
          let app: Electron.App = window['require']('electron').remote;
          console.log(fs, app, window['process']);
        }
      }
    }
    

    Note: The import statements at the top of the file are just to provide for type information. The variable values are set using node require.

    For updates, Track the issue here

    https://github.com/angular/angular-cli/issues/9827

    Edit:

    Turns out, that if your project has dependencies that require 'fs', 'path', 'child_process' etc. The angular compiler fails to compile the code. To get around this, as someone has already suggested, add (window as any).global = window; to your polyfills.ts.

    In my case, I had chokidar, node-pty and electron as a dependency. This worker for me.

提交回复
热议问题