Rollup-plugin-typescript2: لماذا يتم إزالة تعريفات الواجهة؟

تم إنشاؤها على ١٩ يوليو ٢٠١٧  ·  19تعليقات  ·  مصدر: ezolenko/rollup-plugin-typescript2

مرحبا،

أحاول الانتقال من حزمة الويب إلى مجموعة التحديثات الخاصة بمكتبة ولدي مشكلة في جعل الإعلانات تعمل بشكل صحيح.

يبدو أنه لا يتم تصدير إقرارات الواجهات ، فهذه مشكلة عندما يكون لدي أشياء مثل:

import { RenderedCell } from "../RenderedCell";

export default class MergedCell implements RenderedCell {
    // ...
}

تلقيت خطأ مفاده أنه لا يمكن العثور على RenderedCell.
لقد عملت في حزمة الويب ، ولا أستطيع أن أفهم ما هو الاختلاف في التكوين الخاص بي الذي كسر هذا. لكن يبدو أنني أفهم أن هذا أمر طبيعي مع التراكمي.

بالمناسبة. أنا أستخدم أحدث مجموعة تحديثات و Rollup-plugin-typescript2 و rollup-plugin-uglify يمكنني نشر تكويناتي إذا لزم الأمر

التعليق الأكثر فائدة

لما يستحق ، أنا فقط اتصل بـ tsc --emitDeclarationOnly بعد التجميع ، والذي يلغي ملفات التصريح في مجلد الإنشاء.
في مجموعتي. json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}

ال 19 كومينتر

هل هذا خطأ وقت التشغيل ، أو خطأ مكتوب؟ هل يمكنك نشر كيفية تصدير الواجهة من RenderedCell نفسها؟

الشيء هو أن الملف لم يتم إنشاؤه على الإطلاق ، ويفشل عند استخدام المكتبة في مشروع آخر.

انتظر ، هل تتوقع إنشاء واجهة RenderedCell ؟ من الكود الذي قمت بنشره ، من المتوقع أن يكون الملف المسمى RenderedCell.ts موجودًا بدليل واحد فوق الملف الحالي وسيحتاج إلى أن يحتوي على شيء مثل هذا:

export interface RenderedCell 
{ 
    // ...
}

هل يمكنك إعطاء مزيد من التفاصيل حول هيكل مشروعك؟ (شجرة الملفات ، tsconfig ، التكوين التراكمي ، إلخ)

نعم أتوقع أن يتم إنشاؤها.

ها هي تكويناتي:

تشغيل الإصدار: rollup -c -f es -n sq-web-component-table -o dist/sq-web-component-table.es.min.js

لم أضع الشجرة بأكملها لأنها مكتبة كبيرة جدًا وهي ضوضاء أكثر من إشارة. ولكن يمكنك أن ترى بالفعل أنه لم يتم إنشاء العديد من الملفات في منطقة التوزيع.

rollup.config.ts

import typescript from 'rollup-plugin-typescript2';
import uglify from 'rollup-plugin-uglify';
import { minify } from 'uglify-es';

export default {
    entry: './src/index.ts',
    dest: 'dist/sq-web-component-table.min.js',
    sourceMap: true,

    plugins: [
        typescript(),
        uglify({}, minify)
    ]
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "moduleResolution": "node",
    "declaration": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "outDir": "dist"
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "dist",
    "node_modules",
    "**/*-test.ts"
  ]
}

RenderedCell.ts

import {RenderedElement} from "./RenderedElement";
import {RenderedRow} from "./RenderedRow";
export interface RenderedCell extends RenderedElement {
    isMergedCell(): boolean;
    getColspan(): number;
    setColspan(colspan: number): void;
    getParent(): RenderedRow;
}

شجرة الملفات

.
├── src
│   ├── index.ts
│   └── table
│       ├── extensions
│       │   ├── base
│       │   │   ├── FirstTableExtension.ts
│       │   │   ├── LastTableExtension.ts
│       │   │   ├── SectionDispatcher.ts
│       │   │   ├── SectionManager.ts
│       │   │   └── SizeChangeMonitor.ts
│       │   ├── InvalidateEvent.ts
│       │   ├── InvalidateSizesEvent.ts
│       │   ├── RenderedCell.ts
│       │   ├── RenderedElement.ts
│       │   ├── RenderedRow.ts
│       │   ├── RenderedSection.ts
│       │   ├── RenderedTable.ts
│       │   ├── SectionClickedEvent.ts
│       │   ├── support
│       │   │   └── ...
│       │   ├── TableAttributes.ts
│       │   ├── TableExtensionChain.ts
│       │   ├── TableExtensionList.ts
│       │   └── TableExtension.ts
│       ├── model
│       │   └── ...
│       ├── TableRenderingOptions.ts
│       ├── Table.ts
│       ├── util
│       │   └── ...
│       └── view
│           └── ...
├── dist
│   ├── index.d.ts
│   ├── sq-web-component-table.es.min.js
│   ├── sq-web-component-table.es.min.js.map
│   ├── sq-web-component-table.min.js
│   ├── sq-web-component-table.min.js.map
│   └── table
│       ├── extensions
│       │   ├── base
│       │   │   ├── FirstTableExtension.d.ts
│       │   │   ├── LastTableExtension.d.ts
│       │   │   ├── SectionDispatcher.d.ts
│       │   │   ├── SectionManager.d.ts
│       │   │   └── SizeChangeMonitor.d.ts
│       │   ├── InvalidateEvent.d.ts
│       │   ├── InvalidateSizesEvent.d.ts
│       │   ├── RenderedRow.d.ts
│       │   ├── SectionClickedEvent.d.ts
│       │   ├── support
│       │   │   └── ...
│       │   ├── TableAttributes.d.ts
│       │   └── TableExtensionList.d.ts
│       ├── model
│       │   └── ...
│       ├── Table.d.ts
│       ├── util
│       │   └── ...
│       └── view
│           └── ...
├── node_modules
│   └── ...
├── __tests__
│   └── ...
├── package.json
├── rollup.config.js
└── tsconfig.json

آه لقد فهمت. هل التحرير مفتوح المصدر بأي فرصة؟

حاول البناء بهذه الخيارات:

typescript({ verbosity: 2, clean: true }),

تحقق مما إذا كانت جميع الملفات التي تتوقعها قيد المعالجة. إذا بدأ إنشاء الإعلانات فجأة ، فهناك مشكلة في ذاكرة التخزين المؤقت في مكان ما.

إذا لم يتم ذكر RenderedCell.ts في الإخراج ( rpt2: transpiling '...' ) ، قم بزيادة الإسهاب إلى 3 وتحقق مما إذا كانت الملفات التي من المفترض أن تقوم باستيرادها تقوم بذلك. يجب أن ترى شيئًا مثل

rpt2: resolving '../RenderedCell'
rpt2:     to '...'

إذا لم تكن المشكلة واضحة ، فسأضيف المزيد من التسجيل في مكان ما.

أرغب في ذلك ، قد أكون في المستقبل :)

شكرا على الحيل ، سأحاول هذا يوم الاثنين.

إذا قمت بتعيين declaration: false في قسم compilerOptions في tsconfig وأعد التحويل البرمجي ، فهل تختفي المشكلة؟ إذا كانت الإجابة بنعم ، فهل الخطأ الذي أبلغ عنه TSC مرتبط بأحد الملفات الموجودة في دليل dist؟ إذا كانت الإجابة بنعم عن كليهما ، فهل يختفي الخطأ إذا أدخلت بعض المنطق غير النوع إلى الملف الذي يحتوي على ملف RenderedCell مثل تصدير دالة بسيطة؟ إذا كانت الإجابة بنعم ، فالسبب هو أن الملف الذي يحتوي على RenderedCell يعتبر غير مستخدم ولن تقوم شركة Typescript بتجهيز الإعلانات الخاصة به.

إذا كان كل هذا ينطبق عليك ، أرى خيارين:

  • توقف عن إنشاء إعلانات لحزمتك.
  • تأكد من أن العرض الإجمالي لن يؤدي إلى هز الملف بالكامل عن طريق إدخال تغييرات على الملف غير المرتبط بالنوع. نعم ، إنه اختراق وآمل أن نجد طريقة للقيام بعمل أفضل

مرحبا،

آسف للتأخير الطويل ، لقد جربت النصائح والحيل الخاصة بك ولكن ما زلت لا أستطيع الحصول على تعريفات النوع للواجهات التي تم إنشاؤها.

لقد غيرت التكوين إلى typescript({ verbosity: 3, clean: true }) .
في مخرجات البناء الذي تم إنشاؤه ، لا توجد إشارة واحدة لواجهة RenderedCell .

أنا متأكد بنسبة 100٪ من أن هذا الملف مطلوب ، لأن index.d.ts للمكتبة يتطلبه مباشرة ويتم إنشاء جميع الملفات ولكن الواجهات لا تزال في الواردات من index.d.ts ملف.

سوف أتعمق في الكود لمعرفة ما إذا كان هناك سبب معين لعدم إنشاء هذه الملفات.

wessberg توقف عن إنشاء إعلانات

لذلك ، أجريت بعض التحقيقات وأنشأت مستودعًا يعيد إنتاج حالتي بأدنى مجموعة من التكوين: https://github.com/onigoetz/typescript-rollup-experiment

لقد قمت أيضًا بتضمين تكوين حزمة الويب لمقارنة كيفية جعل حزمة الويب تعمل.

ما أفهمه من المشكلة هو أنه عندما يتطلب rollup-plugin-typescript2 إصدارًا مترجمًا من الملف (دعنا نقول index.ts) ، سيعيد Typescript الملفات المترجمة واستيرادها ، ولكن بدون الواجهات في عمليات الاستيراد.

هذا هو السبب في أن التراكمي لا يولدها أبدًا: فهي لا تدرك وجودها.

لتشغيل المستودع ، قم بإجراء npm install && npm run build داخل الدليل.

اذا اضفت:
import "./SomeInterface"; (تمامًا مثل ذلك - بدون أي روابط مسماة) إلى ملف index.ts الخاص بك ، يجب أن يعمل. هل هو كذلك؟

لسوء الحظ ، لا يستدعي Rollup معالج التحويل الخاص بالمكونات الإضافية لملفات التصريح فقط مثل الملفات التي تحتوي على تعريفات النوع فقط. يجب أن يعمل الشيء أعلاه لأن ذلك يجبر Rollup على تقييم الملف. هذه المشكلة: https://github.com/rollup/rollup-plugin-typescript/issues/28 يشرح كيف ولماذا توجد هذه المشكلة. من الناحية النظرية ، يمكننا حل جميع تبعيات تطبيقك يدويًا من نقطة الإدخال وتحديد تلك التي تحتوي فقط على تعريفات النوع ، ولكن لا توجد طريقة لإجبار التجميع على استدعاء خطاف التحويل (بجانب الجوانب السلبية الأخرى مثل تعقيد خطوة البناء الإضافي ).

أخشى أنه لا يمكننا فعل الكثير حيال ذلك دون تغيير مجموعة التحديثات نفسها. يجب أن يعمل "الاختراق" الذي وصفته في الوقت الحالي.

نعم ، تحقق للتو ، إضافة import "./SomeInterface"; في اختبار الريبو يصلح الأشياء.

عند استيراد الأنواع فقط ، يتجاهل المطبوع على عبارات الاستيراد من إخراج js ولا يرى التراكمية هذه الملفات وبالتالي لا يرسلها للترجمة.

سأحاول الغش ومراقبة الملفات المطبوعة المطلوبة من القرص مقابل مجموعة الملفات التي تم إرسالها للترجمة. ينبغي أن يكون من الممكن فرض تفسير الاختلاف باستخدام التعريفات فقط. قد ينتج عن هذا عدد كبير جدًا من ملفات d.ts في بعض الحالات (على سبيل المثال ، بالنسبة للأشياء ، اهتزت مجموعة الملفات بشكل شرعي من الشجرة)

شكرًا للنظر في الأمر ، سأتحقق أيضًا مما إذا كان بإمكاني تقديم مساهمة من أجل ذلك.

onigoetz ، حسنًا ، جرب مشروعك مع السيد. تحقق مما إذا تم إنشاء التصريحات الصحيحة ، ولكن تحقق أيضًا من عدم وجود إعلانات غير متوقعة :)

رائع ، لقد أصلحته litteraly أثناء نومي :)

لقد اختبرت ذلك وهي تعمل بشكل جيد تقريبًا.

هناك مشكلة صغيرة فقط ، لكنني أعتقد أنه شيء لا يمكننا فعل أي شيء ضده ، حيث يقوم أداة تحميل حزمة الويب بنفس الشيء تمامًا ويتم إنشاء قائمة الملفات بواسطة TypeScript نفسها.

كمثال؛ إذا كان لدي ثلاثة ملفات في الريبو الخاص بي:

  • index.ts importing SomeInterface.ts
  • SomeInterface.ts
  • nongenerated.ts importing SomeInterface.ts

nongenerated.ts مطلقًا ولكن يتم إنشاء أنواعه على أي حال.

رائع ، شكرا للاختبار. سأطلقها لاحقًا بعد تأكيد مشكلة أخرى.

نعم ، ليس هناك الكثير مما يمكننا القيام به عند تجاوز مجموعة التحديثات. يجب أن تكون قادرًا على استبعاد هذه الملفات يدويًا في الخيار exclude ، لكن هذا حل بديل ضعيف.

حسنًا ، في 0.5.1 الآن

تعمل بشكل جيد ، فقط config tsconfig.json

{
    "compilerOptions": {
        "module": "es2015",
        "target": "es5",
        "declaration":true,
        "declarationDir": "lib",
        "typeRoots": [
            "node_modules/@six006",
            "node_modules/@types"
        ],
        "lib": [
            "es2015",
            "es2017",
            "es5"
        ],
    },
    "include": [
        "src/index.ts",
        "src/module/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

يخبرك قسم include بما يجب إنشاؤه

YMMV لكنني حصلت عليه للعمل مثل هذا ...

قبل

export type MyType = { ... };

بعد

type MyType = { ... };

export { MyType }

لما يستحق ، أنا فقط اتصل بـ tsc --emitDeclarationOnly بعد التجميع ، والذي يلغي ملفات التصريح في مجلد الإنشاء.
في مجموعتي. json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات