Как импортировать библиотеку в нестрогом режиме в приложении strict Angular?

#angular #typescript #strict-mode

Вопрос:

Я пытаюсь импортировать jschardet в проект Angular 11. Текущая версия 3.0.0 не работает в строгом режиме (выдает ошибку типа во время выполнения). Я попытался воспроизвести эту проблему в минимальном примере. Поэтому я создал новый угловой проект и использовал те же зависимости и конфигурацию (т. Е. Я использую один и тот же tsconfig.json , tsconfig.app.json , angular.json , package.json и package-lock.json в обоих проектах). Однако ошибка типа встречается только в моем большом/оригинальном проекте. Мне не удалось воспроизвести его в меньшем проекте. Я предполагаю, что мой большой проект каким-то образом работает jschardet в строгом режиме (хотя я явно не указывал это в упомянутых файлах), но мой новый проект не работает jschardet в строгом режиме. Я не знаю, какими файлами было бы уместно поделиться, чтобы разобраться в этом. Пожалуйста, дайте мне знать в комментариях.

В любом случае, я бы не хотел запускать свое приложение Angular в нестрогом режиме, только для одной импортированной библиотеки требуется нестрогий режим. Как я могу импортировать/вызвать определенную библиотеку в нестрогом режиме?


Файлы, версии и дополнительная информация ниже:

  • jscharder 3.0.0
  • Машинописный текст 4.0.5
  • @угловой/компилятор 11.1.0

src/приложение/app.component.ts

 import { Component } from '@angular/core';
import * as jschardet from 'jschardet';

@Component({
  selector: 'app-root',
  template: `
      <input type="file" id="file" (change)="decode($event)">
  `
})
export class AppComponent {
  decode(e: any) {
    const file = e.target.files[0];
    console.log(typeof file);
    const fileReader = new FileReader();
    fileReader.onload = function() {
      const array = new Uint8Array(fileReader.result as ArrayBuffer);
      let string = "";
      for (let i = 0; i < array.length;   i) {
        string  = String.fromCharCode(array[i]);
      }
      console.log(jschardet.detect(string));
    };
    fileReader.readAsArrayBuffer(file);
  }
}
 

tsconfig.json

 {
  "compileOnSave": false,
  "compilerOptions": {
    "importHelpers": true,
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "downlevelIteration": true,
    "target": "es2015",
    "typeRoots": [
    ],
    "lib": [
      "es2017",
      "dom",
      "dom.iterable"
    ],
    "types": [
      "node",
      "core-js"
    ],
    "module": "es2020",
    "baseUrl": "./"
  }
}
 

src/tsconfig.json

 {
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "types": [ "node" ],
    "typeRoots": [ "../node_modules/@types" ]
  },
  "angularCompilerOptions": {
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true
  },
  "files": [
    "main.ts",
    "polyfills.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ]
}
 

angular.json (сокращенно)

 {
  "projects": {
    "my-app": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "aot": true,
            "outputPath": "dist",
            "index": "src/index.html",
            "main": "src/main.ts",
            "tsConfig": "src/tsconfig.app.json",
            "polyfills": "src/polyfills.ts"
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "my-app:build"
          }
        }
      }
    }
  }
}
 

Я запускаю оба проекта с помощью ng serve .

Ответ №1:

Я нашел обходной путь. Это работает, если я использую динамический импорт

 const jschardet = await import('jschardet');
console.log(jschardet.detect(string));
 

Я до сих пор точно не знаю, почему. Если я использую обычный импорт, библиотека является частью встроенного пакета vendor.js , который определяет

 "use strict";
 

Если я использую динамический импорт, библиотека представляет собой отдельный файл модуля, который не определяет

 "use strict";
 

Я не уверен, работает ли этот обходной путь в целом. Пожалуйста, добавьте еще один ответ или комментарий, если вы знаете больше.