ค้นหาเว็บไซต์

กำลังสร้าง Typescript: [!] ข้อผิดพลาด: พบโทเคนที่ไม่คาดคิด (โปรดทราบว่าคุณจำเป็นต้องใช้ปลั๊กอินเพื่อ import ไฟล์ที่ไม่ใช่ JavaScript)


ฉันพบปัญหาในการสร้างแพ็กเกจ TypeScript ด้วย Rollup ภายในมอนอรีโปที่จัดการโดย Lerna

ข้อผิดพลาด :

lerna ERR! rollup --config ../../rollup.config.js stderr:
loaded ../../rollup.config.js with warnings
(!) Unused external imports
terser imported from external module 'rollup-plugin-terser' but never used

index.ts → dist/esm...
[!] Error: Unexpected token (Note that you need plugins to import files that are not JavaScript)
../mokui-base/component.ts (3:7)
1: const root = Symbol("root");
2: 
3: export type Component<T extends object = {}> = T & {
          ^
4:         [root]: Element;
5:         attach(element: Element): Component<T>;
Error: Unexpected token (Note that you need plugins to import files that are not JavaScript)
    at error (/****/****/code/js/mokui/node_modules/rollup/dist/rollup.js:5351:30)
    at Module.error (/****/****/code/js/mokui/node_modules/rollup/dist/rollup.js:9643:9)
    at tryParse (/****/****/code/js/mokui/node_modules/rollup/dist/rollup.js:9552:16)
    at Module.setSource (/****/****/code/js/mokui/node_modules/rollup/dist/rollup.js:9868:33)
    at Promise.resolve.catch.then.then.then (/****/****/code/js/mokui/node_modules/rollup/dist/rollup.js:12148:20)


lerna ERR! rollup --config ../../rollup.config.js exited 1 in '@moki.codes/mokui-header'

ข้อผิดพลาดชี้ไปที่โทเคน "export type" ซึ่งก็... สับสน ทำไม TypeScript ถึงไม่เข้าใจโครงสร้างของตัวเองก็ไม่แน่ใจ

สามารถทำให้เกิดข้อผิดพลาดได้โดยการโคลนรีโพซิทอรีและรัน yarn build:packages ในสาขา @master

น่าสนใจที่แพ็กเกจ mokui-base ซึ่งกำหนด Component นั้นสามารถสร้างได้ดีด้วยตัวมันเอง แต่จะเกิดข้อผิดพลาดตามด้านบนเมื่อสร้างก็ต่อเมื่อมีการพึ่งพามันเหมือนที่ฉันทำภายใน mokui-header สามารถทำซ้ำได้โดยการเพิ่ม

if (process.env.LERNA_PACKAGE_NAME === "@moki.codes/mokui-header")
    process.exit(0);

ที่ด้านบนของ rollup.config.js และรัน yarn build:packages

ฉันยังมีเป้าหมายการสร้างอีกอันหนึ่งชื่อว่า "dev" ซึ่งสามารถลองใช้ yarn build:dev ซึ่งจะสร้างจาก stories/index.ts และให้บริการที่ localhost:3000 สิ่งนี้เกี่ยวข้องกับคำถามเพราะที่นั่น mokui-header Header สร้างได้โดยไม่มีปัญหา ขึ้นอยู่กับ mokui-base Component Header factory ถูกใช้งานภายใน index.ts และไม่ให้ข้อผิดพลาด ทำงานตามที่ตั้งใจไว้ และให้พฤติกรรมที่กำหนดไว้

สัญชาตญาณแรกของฉันคือเลือกที่จะไม่ใช้การสร้าง cjs เพราะนั่นคือความแตกต่างหลักระหว่างสองการสร้าง (build:packages และ build:dev) แต่ก็ไม่ได้ทำให้เกิดความแตกต่างใด ๆ ดังนั้นจึงเหลือเพียงปัญหาการแก้ไข @organization/package ฉันเดาว่า ฉันไม่แน่ใจ… ไม่ใช่เรื่องที่ฉันรู้ว่าจะไปต่อจากตรงนั้นอย่างไรหากเป็นกรณีนั้น การลบ export ที่ export type Component =... ภายในไฟล์ต้นฉบับ component.ts จะทำให้ข้อผิดพลาดหายไป แต่แน่นอนว่ามันก็สร้างข้อผิดพลาดใหม่ภายใน mokui-header HeaderComponent บ่นว่า Component is a value but used as type เพราะว่า… ตอนนี้ไม่มีการส่งออกประเภท Component ให้ใช้งานอีกต่อไป

ดังนั้น ถ้าคุณมีไอเดียว่าฉันควรไปทางไหนจากตรงนี้หรือรู้ว่าฉันควรสร้างแพ็กเกจไทป์สคริปต์ซึ่งขึ้นอยู่กับแพ็กเกจพี่น้องอีกตัวอย่างไร โปรดแชร์มันด้วย

ฉันขอโทษหากฉันพูดจาหยาบคาย แต่กรุณาอย่าแนะนำให้ฉันเลือกที่จะไม่ใช้การสร้างแบบกำหนดเองและไปใช้แบบสำเร็จรูปหรือตัวอย่างสำเร็จรูปอะไรประมาณนั้น

ขอบคุณล่วงหน้า!

คำตอบ #1

ในกรณีที่ใครเจอปัญหาเดียวกัน ด้านล่างนี้ฉันขอเสนอวิธีแก้ไข:

เมื่อมีคนพยายามสร้างแต่ละแพ็กเกจแยกกันภายในมอนอรีโป Rollup จะพยายามแก้ไข @organization/package-name และรวมมันในการสร้าง คุณคงไม่ต้องการแบบนั้น ดังนั้นเพื่อหลีกเลี่ยงขณะสร้างแต่ละแพ็กเกจ ผมจึงกำลังวิเคราะห์ package.json ดึงคีย์ของฟิลด์ dependencies ออกมา แล้วตรวจสอบกับคีย์เหล่านั้นภายใน callback ที่สามารถระบุในฟิลด์ external ของการตั้งค่า Rollup วิธีนี้จะให้ผลลัพธ์ตามที่ต้องการ

import json from "rollup-plugin-json";

const pkg = process.env.LERNA_PACKAGE_NAME &&
          require(`${process.env.LERNA_PACKAGE_NAME}/package.json`);

const dependencies = ({ dependencies }) => Object.keys(dependencies || {});

const pkgdependencies = dependencies(pkg);

/* exported rollup configuration */
const config = {
    /* your config goes here... */
    /* id is the source name if list of dependencies includes
     * id source name, then mark it as external,
     */
    external: id => pkgdependencies.includes(id)
};

export default config;

คำตอบ #2

ฉันเจอข้อความแสดงข้อผิดพลาดเดียวกัน ใช้ lerna ด้วยเช่นกัน

สำหรับฉัน การอัปเดต typescript เป็นเวอร์ชัน 4.2.3 ใช้ได้ผล

ฉันพบวิธีแก้ปัญหาในปัญหาหนึ่งของ repo rollup/plugins

บทความที่เกี่ยวข้อง