تايبسكريبت - استخدام التعريفات الخاصة بالمكتبة لشبكة التوزيع (CDN)


أريد استخدام شبكة توزيع المحتوى (CDN) للوصول إلى مكتبة التحقق من صحة JSON، لأنها من المفترض أن تكون أسرع قليلاً (تحصل على الملف من أقرب خادم متاح في شبكة CDN).

هذه مكتبة التحقق من صحة JSON: https://github.com/epoberezkin/ajv#using-in-browser

إنه يوجهني إلى هذا الـ CDN: https://cdnjs.com/libraries/ajv

لذلك أدرج ذلك في ملف HTML الخاص بي:

<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/4.10.4/ajv.min.js" integrity="sha256-LtA3VfycAam30/5e2Fq1f2tg8eIiFMOVWp1NDd6jmUU=" crossorigin="anonymous"></script>
</head>

الآن التعريفات... لقد قمت بتشغيل npm install --save-dev @types/ajv وتم التثبيت.

node_modules/@types/ajv/package.json:

{
  "_args": [
    [
      {
        "raw": "@types/ajv",
        "scope": "@types",
        "escapedName": "@types%2fajv",
        "name": "@types/ajv",
        "rawSpec": "",
        "spec": "latest",
        "type": "tag"
      },
      "C:\\Users\\si556577\\Documents\\SSWebApp\\app\\Iag.DI.Web.SupplierApp"
    ]
  ],
  "_from": "@types/ajv@latest",
  "_id": "@types/[email ",
  "_inCache": true,
  "_installable": true,
  "_location": "/@types/ajv",
  "_npmOperationalInternal": {
    "host": "packages-12-west.internal.npmjs.com",
    "tmp": "tmp/ajv-1.0.0.tgz_1482502603556_0.6872997884638608"
  },
  "_npmUser": {
    "name": "types",
    "email": "[email "
  },
  "_phantomChildren": {},
  "_requested": {
    "raw": "@types/ajv",
    "scope": "@types",
    "escapedName": "@types%2fajv",
    "name": "@types/ajv",
    "rawSpec": "",
    "spec": "latest",
    "type": "tag"
  },
  "_requiredBy": [
    "#DEV:/",
    "#USER"
  ],
  "_resolved": "https://registry.npmjs.org/@types/ajv/-/ajv-1.0.0.tgz",
  "_shasum": "4fb2440742f2f6c30e7fb0797b839fc6f696682a",
  "_shrinkwrap": null,
  "_spec": "@types/ajv",
  "_where": "C:\\Users\\si556577\\Documents\\SSWebApp\\app\\Iag.DI.Web.SupplierApp",
  "author": "",
  "bugs": {
    "url": "https://github.com/epoberezkin/ajv/issues"
  },
  "dependencies": {
    "ajv": "*"
  },
  "deprecated": "This is a stub types definition for ajv (https://github.com/epoberezkin/ajv). ajv provides its own type definitions, so you don't need @types/ajv installed!",
  "description": "Stub TypeScript definitions entry for ajv, which provides its own types definitions",
  "devDependencies": {},
  "directories": {},
  "dist": {
    "shasum": "4fb2440742f2f6c30e7fb0797b839fc6f696682a",
    "tarball": "https://registry.npmjs.org/@types/ajv/-/ajv-1.0.0.tgz"
  },
  "homepage": "https://github.com/epoberezkin/ajv#readme",
  "license": "MIT",
  "main": "",
  "maintainers": [
    {
      "name": "types",
      "email": "[email "
    }
  ],
  "name": "@types/ajv",
  "optionalDependencies": {},
  "readme": "ERROR: No README data found!",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/ajv.git"
  },
  "scripts": {},
  "typings": null,
  "version": "1.0.0"
}

وأضاف أيضًا هذا إلى package.json:

"devDependencies": {
    "@types/ajv": "^1.0.0",

في الكود أستخدمه هكذا:

validateJSONSchema(json) {
    var ajv = new Ajv();
    var valid = ajv.validate(this.schema, json);
    if (!valid) {
        console.log(ajv.errors);
        return false;
    } else {
        return true;
    }
}

الكود يعمل، ومع ذلك في VS Code أحصل على خطأ وقت الترجمة: لا يمكن العثور على الاسم "Ajv"

كيف أجعل تعريفاتي تعمل؟ لقد استخدمت التعريفات فقط عند تثبيت الحزمة محليًا بدلًا من استخدام CDN. هل يمكن أن تعمل التعريفات حتى عند استخدام CDN؟

الإجابة رقم 1

يُلاحظ في ملف package.json لـ ajv أن @types/ajv أصبح الآن مهجورًا وأن التعريفات مضمنة مع الحزمة نفسها:

هذا تعريف أنواع تجريبي لـ ajv (https://github.com/epoberezkin/ajv). يوفر ajv تعريفاته الخاصة للأنواع، لذلك لا تحتاج إلى تثبيت @types/ajv!

ومع ذلك، فإن التعريفات المضمنة مع الحزمة نفسها يُقصد استخدامها على هذا النحو:

import * as Ajv from "ajv";
let ajv = new Ajv(...);

لذا لن يكون TypeScript سعيدًا بالأنواع ما لم تُستخدم تعليمات import.

هذا يعني أنه إذا كنت تريد استخدام شبكة توصيل المحتوى (CDN)، فسيتعين عليك تكوين جامع الوحدات الخاص بك للقيام بذلك. لن يكون كافيًا تضمين <script> الخاص بـ CDN وجعل Ajv متاحًا كمتغير عالمي.

كيف تفعل ذلك يعتمد على المجمع الذي تستخدمه.