https://github.com/brandon-leapyear/rollup-optional-chaining-repro
Disalin dari README:
yarn rollup -c
Batalkan komentar pada baris
"target": "esnext"
ditsconfig.json
untuk menampilkan kesalahan:index.ts: (3:57) [!] Error: Unexpected token (Note that you need plugins to import files that are not JavaScript) index.ts (3:57) 1: import React from 'react' 2: 3: const a: { b?: string } = {} ^ 4: 5: export default () => <span>{a?.b}</span> Error: Unexpected token (Note that you need plugins to import files that are not JavaScript) at error (/Users/bchinn/Desktop/rollup-example/node_modules/rollup/dist/rollup.js:5351:30) at Module.error (/Users/bchinn/Desktop/rollup-example/node_modules/rollup/dist/rollup.js:9643:9) at tryParse (/Users/bchinn/Desktop/rollup-example/node_modules/rollup/dist/rollup.js:9552:16) at Module.setSource (/Users/bchinn/Desktop/rollup-example/node_modules/rollup/dist/rollup.js:9868:33) at /Users/bchinn/Desktop/rollup-example/node_modules/rollup/dist/rollup.js:12148:20 at async Promise.all (index 0) at async Promise.all (index 0) at async Promise.all (index 0)
Tampaknya menjadi bug
rollup-plugin-typescript2
karena dengan"target": "esnext"
tidak dikomentari,yarn tsc --noEmit
masih berfungsi (mis. TypeScript mem-parsingnya dengan baik).
Seharusnya tidak relevan
import typescript from 'rollup-plugin-typescript2'
export default {
input: 'index.ts',
output: [
{
file: 'dist/index.js',
format: 'es',
},
],
plugins: [
typescript({
typescript: require('typescript'),
})
],
}
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"jsx": "react",
// Uncomment to break:
// "target": "esnext",
}
}
{
"name": "rollup-optional-chaining-repro",
"version": "0.0.1",
"private": true,
"devDependencies": {
"rollup": "^1.27.0",
"rollup-plugin-typescript2": "^0.25.2"
},
"dependencies": {
"typescript": "^3.7.2"
}
}
TypeScript mentranspilasikan a?.b
ke (_a = a) === null || _a === void 0 ? void 0 : _a.b
ketika es2015
(default) digunakan.
Ini mengubah a?.b
menjadi a?.b
ketika esnext
digunakan. Saya kira ini adalah fitur JS asli di esnext,
Kesalahan yang Anda lihat adalah rollup gagal mengurai ini. (tidak yakin apakah mereka seharusnya mendukungnya atau tidak).
Anda dapat memverifikasi dengan menjalankan tsc
, membuatnya memancarkan index.js dan kemudian menggunakan file js sebagai input rollup. Anda harus mendapatkan kesalahan yang sama.
Saya tidak berpikir itu masalahnya. Setelah membatalkan komentar "target": "esnext"
dan menjalankan yarn tsc index.ts
, index.js
berisi:
var _a;
var a = {};
console.log((_a = a) === null || _a === void 0 ? void 0 : _a.b);
( yarn rollup -c
masih gagal)
Hm, tidak terjadi pada saya, saya mengerti
const a = {};
console.log(a?.b);
Periksa apakah versi TypeScript Anda seperti yang Anda pikirkan (mungkin yarn meluncurkan versi global?):
.\node_modules\.bin\tsc --version
Version 3.7.2
Saya memiliki masalah yang sama dengan target "esnext" dan chaining opsional. Apakah ada perbaikan belum? Semuanya dikompilasi dengan tsc
@dagda1 ini bukan bug -- ini adalah TypeScript yang menghasilkan kode yang benar (untuk target selanjutnya) yang tidak dapat dikonsumsi oleh rollup. Anda dapat menambahkan plugin babel ke dalam rantai jika Anda harus memiliki esnext.
@ezolenko apakah ini masih kasus bahwa plugin babel tambahan diperlukan untuk rollup dan rantai opsional?
Sejauh yang saya tahu ya, Anda dapat mencoba dengan versi rollup terbaru dan melihat apakah itu berfungsi (jika ada yang diperbaiki, itu akan berada di sisi rollup atau di salah satu dependensinya).