Trình trang trí webpack babel 6 ES6


101

Tôi có một dự án được viết bằng ES6 với webpack làm gói của tôi. Hầu hết các chuyển đổi đều hoạt động tốt, nhưng khi tôi cố gắng đưa trình trang trí vào bất kỳ đâu, tôi gặp lỗi này:

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

Tôi đã xem qua trình theo dõi vấn đề babel và không thể tìm thấy bất kỳ thứ gì trên đó, vì vậy tôi cho rằng mình đang sử dụng sai. Cấu hình webpack của tôi (các bit có liên quan):

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

Tôi không gặp rắc rối với bất cứ thứ gì khác, các chức năng mũi tên, cấu trúc lại đều hoạt động tốt, đây là điều duy nhất không hoạt động.

Tôi biết tôi luôn có thể hạ cấp xuống babel 5.8 nơi tôi đã làm việc trước đó, nhưng nếu có bất kỳ cách nào để làm cho điều này hoạt động trong phiên bản hiện tại (v6.2.0), nó sẽ hữu ích.


Tôi đã nghĩ vì tôi bao gồm cài đặt trước giai đoạn 0, rằng chúng sẽ nhận được propery chuyển đổi. Trình trang trí là một phần của cài đặt trước giai đoạn 1 nên bao gồm các trình trang trí biến đổi. Như đã viết trên trang web babel.
Pavlin

@Pavlin Tôi đang nghĩ liệu đây có thể là vấn đề với việc đặt hàng presets.
Sulthan

Tôi nghĩ nó có thể là như vậy, nhưng tôi đã thử nghiệm nó một lần nữa. Bất kỳ cách nào tôi đặt nó, tôi nhận được một lỗi. Rõ ràng thứ tự có vấn đề, nhưng tôi không nghĩ đó là vấn đề ở đây.
Pavlin

Câu trả lời:


170

Plugin Babel này phù hợp với tôi:

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"],
    // ...
  ]
}

hoặc là

Webpack

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

React Native

Với react-nativebạn phải sử dụng babel-preset-react-native-stage-0plugin thay thế.

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

.babelrc

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

Vui lòng xem câu hỏi và câu trả lời này để được giải thích đầy đủ.


Có thể bạn sẽ không muốn plugin chỉ được bật cho development.
loganfsmyth

Cảm ơn @loganfsmyth. Tôi cũng đã cập nhật câu trả lời để đưa productionvào
Kyle Finley

1
Ý tôi là, tại sao lại đặt nó trong một envkhối? Bạn có thể có pluginsnhư anh chị em ruột củapresets
loganfsmyth

1
@ am5255, nó dường như vẫn hoạt động cho tôi. Bạn có phiền gửi vấn đề với tác giả không? github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/...
Kyle Finley

1
Cuối cùng đã có thể làm cho điều này hoạt động. Lần lượt ra tôi đã phải cài đặt transform-class-propertiescũng babeljs.io/docs/plugins/transform-class-properties và cũng đảm bảo rằng các plugin di sản là trước khi chuyển lớp cắm theo các tài liệu trong github.com/loganfsmyth/babel-plugin- transform-trang trí-legacy
reectrix

41

Sau khi dành 5 phút trên webchat của babeljs, tôi phát hiện ra rằng các trình trang trí đã bị hỏng trong phiên bản hiện tại của babel (v6.2). Giải pháp duy nhất dường như là hạ cấp xuống 5,8 tại thời điểm này.

Có vẻ như họ đã chuyển trình theo dõi vấn đề của mình từ github sang https://phabricator.babeljs.io

Tôi viết ra tất cả những điều này, vì sau hàng giờ tìm kiếm, tôi thấy tài liệu hiện tại rất nghèo nàn và thiếu thốn.


6
Từ vấn đề đó, một plugin kế thừa "nỗ lực hết sức có giới hạn" đã được thực hiện. Xem readme để biết các giới hạn: npmjs.com/package/babel-plugin-transform-decorators-legacy
Jason

Tôi có thể xác nhận rằng di sản của bộ trang trí biến đổi đang hoạt động đối với tôi như một giải pháp tạm thời.
dvlsg

@Pavlin, mặc dù câu trả lời của bạn có thể đúng, plugin được liệt kê bên dưới sẽ là câu trả lời được chấp nhận ngay bây giờ.
Ajax

8

Việc cài đặt chỉ babel-plugin-transform-decorators-legacykhông hoạt động với tôi (tôi có cấu hình sử dụng enzyme cùng với karma). Hóa ra cài đặt transform-class-properties: biến đổi-class-thuộc tính và cũng đảm bảo rằng plugin kế thừa có trước plugin lớp biến đổi theo tài liệu trong biến đổi-trang trí-kế thừa cuối cùng đã làm cho nó hoạt động đối với tôi.

Tôi cũng không sử dụng .babelrctệp, nhưng việc thêm karma.conf.jstệp này vào tệp của tôi có tác dụng với tôi:

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

Tôi cũng đã thêm nó vào bộ tải của mình:

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
Dành một giờ ở đây và ở đó và điều này đã làm việc cho tôi. Cảm ơn rất nhiều
cjmling

3

Bạn chỉ cần một plugin trang trí biến đổi: http://babeljs.io/docs/plugins/transform-decorators/


1
Vẫn thất bại đối với tôi với điều đó.
amcdnl

3
@amcdnl ấn tượng của tôi là plugin biến đổi trang trí là plugin chính thức nhưng chưa hoàn thành do các ràng buộc TC39, trong khi đó, có điều này - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
Qiming

@Qiming thats yup những gì tôi đã kết thúc việc sử dụng và chính thức babel thậm chí nói rằng nếu u đào đủ xa .. ý tưởng khá khủng khiếp về phía họ imo
amcdnl

1

Nếu bạn đã nâng cấp dự án của mình từ Babel 6 lên Babel 7, thì bạn muốn cài đặt @babel/plugin-proposal-decorators .

Nếu bạn muốn hỗ trợ các trình trang trí cũ như được sử dụng trong Babel 5, bạn cần định cấu hình .babelrc như sau:

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

Đảm bảo @babel/plugin-proposal-decoratorsđi trước @babel/plugin-proposal-class-propertiestrong trường hợp bạn đang sử dụng cái sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.