Webpack babel 6 ES6 มัณฑนากร


101

ฉันมีโปรเจ็กต์ที่เขียนด้วย ES6 โดยมี webpack เป็นบันเดิลเลอร์ การถ่ายโอนข้อมูลส่วนใหญ่ทำงานได้ดี แต่เมื่อฉันพยายามรวมมัณฑนากรไว้ที่ใดก็ได้ฉันได้รับข้อผิดพลาดนี้:

Decorators are not supported yet in 6.x pending proposal update.

ฉันได้ตรวจสอบตัวติดตามปัญหาของ babel แล้วและไม่พบสิ่งใดในนั้นดังนั้นฉันจึงคิดว่าฉันใช้ผิด การกำหนดค่า webpack ของฉัน (บิตที่เกี่ยวข้อง):

loaders: [
  {
    loader: 'babel',
    exclude: /node_modules/,
    include: path.join(__dirname, 'src'),
    test: /\.jsx?$/,
    query: {
      plugins: ['transform-runtime'],
      presets: ['es2015', 'stage-0', 'react']
    }
  }
]

ฉันไม่มีปัญหากับสิ่งอื่นใดฟังก์ชันลูกศรการทำลายทุกอย่างทำงานได้ดีนี่เป็นสิ่งเดียวที่ใช้ไม่ได้

ฉันรู้ว่าฉันสามารถปรับลดรุ่นเป็น babel 5.8 ได้ตลอดเวลาที่ฉันใช้งานได้เมื่อไม่นานมานี้ แต่ถ้ามีวิธีใดที่จะทำให้สิ่งนี้ใช้งานได้ในเวอร์ชันปัจจุบัน (v6.2.0) ก็จะช่วยได้


ฉันคิดตั้งแต่ฉันรวมค่าที่ตั้งไว้ล่วงหน้าของ stage-0 แล้วว่าพวกเขาจะได้รับการเปลี่ยนแปลงที่เหมาะสม มัณฑนากรเป็นส่วนหนึ่งของค่าที่ตั้งไว้ล่วงหน้าของ stage-1 ซึ่งควรรวมถึงผู้ตกแต่งแปลงร่าง ตามที่เขียนไว้ในเว็บไซต์ babel.
Pavlin

@Pavlin ฉันคิดว่านี่อาจเป็นปัญหากับการสั่งซื้อของpresets.
Sulthan

ฉันคิดว่ามันอาจจะเป็นอย่างนั้น แต่ฉันทดสอบอีกครั้ง วิธีใดก็ตามที่ฉันใส่ฉันได้รับข้อผิดพลาด เห็นได้ชัดว่าคำสั่งซื้อมีความสำคัญ แต่ฉันไม่คิดว่านั่นเป็นปัญหาที่นี่
Pavlin

คำตอบ:


170

ปลั๊กอิน Babel นี้ใช้ได้กับฉัน:

https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy

npm i --save-dev babel-plugin-transform-decorators-legacy

.babelrc

{
  "presets": ["es2015", "stage-0", "react"],
  "plugins": [
    ["transform-decorators-legacy"],
    // ...
  ]
}

หรือ

Webpack

{
  test: /\.jsx?$/,
  loader: 'babel',
  query: {
    cacheDirectory: true,
    plugins: ['transform-decorators-legacy' ],
    presets: ['es2015', 'stage-0', 'react']
  }
}

ตอบสนองดั้งเดิม

ด้วยreact-nativeคุณต้องใช้babel-preset-react-native-stage-0ปลั๊กอินแทน

npm i --save babel-preset-react-native-stage-0

.babelrc

{
  "presets": ["react-native-stage-0/decorator-support"]
}

โปรดดูคำถามนี้และคำตอบสำหรับคำอธิบายที่สมบูรณ์


คุณอาจไม่ต้องการให้ปลั๊กอินเปิดใช้งานสำหรับdevelopmentไฟล์.
loganfsmyth

ขอบคุณ @loganfsmyth ฉันอัปเดตคำตอบเพื่อรวมproductionไว้ด้วย
Kyle Finley

1
ฉันหมายความว่าทำไมต้องใส่ไว้ในenvบล็อกเลย? คุณสามารถมีpluginsเป็นพี่น้องของpresets
loganfsmyth

1
@ am5255 ดูเหมือนว่าจะยังใช้งานได้สำหรับฉัน คุณช่วยส่งปัญหากับผู้เขียนได้ไหม github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/…
Kyle Finley

1
ในที่สุดก็สามารถทำงานนี้ได้ ปรากฎว่าฉันต้องติดตั้งbabeljs.io/docs/plugins/transform-class-propertiestransform-class-propertiesด้วยเช่นกันและตรวจสอบให้แน่ใจว่าปลั๊กอินเดิมอยู่ก่อนปลั๊กอินคลาสการแปลงตามเอกสารในgithub.com/loganfsmyth/babel-plugin- transform-decorators-legacy
reectrix

41

หลังจากใช้เวลา 5 นาทีใน webchat ที่หย่อนของ babeljs ฉันพบว่ามัณฑนากรเสียใน babel เวอร์ชันปัจจุบัน (v6.2) ทางออกเดียวที่ดูเหมือนว่าจะปรับลดรุ่นเป็น 5.8 ในขณะนี้

ดูเหมือนว่าพวกเขาจะย้ายตัวติดตามปัญหาจาก github ไปที่https://phabricator.babeljs.io

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


6
จากปัญหาดังกล่าวได้มีการสร้างปลั๊กอินแบบเดิมที่ "พยายามอย่างดีที่สุดโดยมีข้อ จำกัด " ดูข้อ จำกัด ใน Readme: npmjs.com/package/babel-plugin-transform-decorators-legacy
Jason

ฉันสามารถยืนยันได้ว่ามรดกตกทอดของนักตกแต่งการเปลี่ยนแปลงกำลังทำงานให้ฉันเป็นวิธีแก้ปัญหาชั่วคราว
dvlsg

@Pavlin แม้ว่าคำตอบของคุณอาจถูกต้อง แต่ปลั๊กอินที่แสดงด้านล่างควรเป็นคำตอบที่ยอมรับในตอนนี้
Ajax

8

การติดตั้งเพียงอย่างเดียวbabel-plugin-transform-decorators-legacyไม่ได้ผลสำหรับฉัน (ฉันมีการกำหนดค่าโดยใช้เอนไซม์ร่วมกับกรรม) ปรากฎว่ามีการติดตั้งtransform-class-properties: transform-class-propertiesและตรวจสอบให้แน่ใจว่าปลั๊กอินเดิมอยู่ก่อนปลั๊กอิน transform class ตามเอกสารในtransform-decorators-legacyในที่สุดก็ใช้งานได้สำหรับฉัน

ฉันไม่ได้ใช้.babelrcไฟล์ แต่การเพิ่มสิ่งนี้ลงในkarma.conf.jsไฟล์ของฉันได้ผลสำหรับฉัน:

babelPreprocessor: {
  options: {
    presets: ['airbnb', 'es2015', 'stage-0', 'react'],
    plugins: ["transform-decorators-legacy", "transform-class-properties"]
  }
}

ฉันยังเพิ่มลงในรถตักของฉัน:

loaders: [
  {
    test: /\.js$/,
    loader: 'babel',
    exclude: path.resolve(__dirname, 'node_modules'),
    query: {
      presets: ['airbnb', 'es2015', 'stage-0', 'react'],
      plugins: ["transform-decorators-legacy", "transform-class-properties"]
    }
  },

1
ใช้เวลาหนึ่งชั่วโมงที่นี่และสิ่งนี้ได้ผลสำหรับฉัน ขอบคุณมาก
cjmling

3

คุณเพียงแค่ต้องมีปลั๊กอินแปลงตกแต่งตกแต่ง: http://babeljs.io/docs/plugins/transform-decorators/


1
ยังคงล้มเหลวสำหรับฉันด้วยสิ่งนั้น
amcdnl

3
@amcdnl ความประทับใจของฉันคือปลั๊กอิน Transform Decorators เป็นปลั๊กอินที่เป็นทางการ แต่ไม่ได้ใช้งานเนื่องจากข้อ จำกัด ของ TC39 ในระหว่างนี้มีสิ่งนี้ - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming

@Qiming ใช่นั่นคือสิ่งที่ฉันใช้และเจ้าหน้าที่ของ Babel ยังบอกว่าถ้าคุณขุดได้ไกลพอ .. ความคิดที่แย่มากในส่วนของพวกเขา imo
amcdnl

1

ถ้าคุณปรับรุ่นโครงการของคุณจาก Babel 6 ถึง 7 Babel @babel/plugin-proposal-decoratorsแล้วคุณต้องการที่จะติดตั้ง

หากคุณต้องการสนับสนุนมัณฑนากรแบบดั้งเดิมตามที่ใช้ใน Babel 5 คุณต้องกำหนดค่า.babelrcดังต่อไปนี้:

plugins: [
      ['@babel/plugin-proposal-decorators', { legacy: true }],
      ['@babel/plugin-proposal-class-properties', { loose: true }],
]

ตรวจสอบให้แน่ใจว่า@babel/plugin-proposal-decoratorsมาก่อน@babel/plugin-proposal-class-propertiesในกรณีที่คุณใช้ประโยชน์อย่างหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.