跳至主内容

6.18.0 版本发布

· 1 分钟阅读
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

更多 Flow 更新以及大量修复!

自上次发布以来,我们为 Babel 新增了 4 位协作者!

所有辛勤工作都归功于他们以及我们的新贡献者!

他们一直与 @loganfsmyth@danez 以及我共同维持项目运转!

v6.18.0 版本摘要 (2016-10-24)

再次提醒:如果您近期尚未关注,我们已回归使用 Github Issues!这完全归功于 @danez

🚀 新特性

#4697 新增方差节点类型并生成属性方差注解。(@samwgoldman)

查看这篇博客文章flow 文档获取更多信息:

JavaScript
type T = { +p: T };
interface T { -p: T };
declare class T { +[k:K]: V };
class T { -[k:K]: V };
class C2 { +p: T = e };

#4746 在静态路径求值中支持 ObjectExpression。(@motiz88)

适用于 babel/babili 及其他插件。

JavaScript
// in
{['a' + 'b']: 10 * 20, 'z': [1, 2, 3]}
// out
{ab: 200, z: [1, 2, 3]}

#4699 import():初步支持 dynamic-import。(@kesne)

解析器支持已在 babel/babylon#v6.12.0 中添加。

此功能仅需通过插件在 Babel 中启用。

JavaScript
// install
$ npm install babel-plugin-syntax-dynamic-import --save-dev

或使用新的 parserOpts

JavaScript
// .babelrc
{
"parserOpts": {
"plugins": ['dynamicImport']
}
}

#4655 为 helper-builder-react-jsx 添加 useBuiltIns 选项。(@existentialism)

此前我们已为 object-rest-spread 添加 useBuiltIns 选项,使其在使用 polyfill 或原生支持时采用原生/内置版本。

本次变更将该选项应用于 JSX 内部的展开语法。

JavaScript
// in
var div = <Component {...props} foo="bar" />
// out
var div = React.createElement(Component, Object.assign({}, props, { foo: "bar" }));

#4724 新增 EmptyTypeAnnotation。(@samwgoldman)

已在 Flow 此处 和 Babylon 此处 实现。

JavaScript
function f<T>(x: empty): T {
return x;
}
f(); // nothing to pass...

#4758 使 getBinding 忽略标签;新增 Scope#getLabel、Scope#hasLabel、Scope#registerLabel 方法。(@kangax)

单独追踪 LabeledStatement(不属于绑定范畴)。

💅 优化改进

#4690 在解构转换中合并连续的 var 声明。(@motiz88)

JavaScript
// in
const [a, b] = [1, 2];
// out
var a = 1,
b = 2;

#4685 当预设选项未对应实际预设时提供更清晰的错误信息。(@kaicataldo)

我们收到多起用户未用 [] 包裹带选项预设的报告,因此特别增加了此错误提示。

JavaScript
// incorrect, and current gives a unexpected error message
{
"presets": [
"preset",
{ "presetOptions": 'hi' } // gets parsed as another preset instead of being part of the "preset"
]
}
// correct
{
"presets": [
["preset",
{
"presetOptions": 'hi'
}
]
]
}
ReferenceError: [BABEL] /test.js: Unknown option: base.loose2. Check out http://babeljs.io/docs/usage/options/ for more information about options.

A common cause of this error is the presence of a configuration options object without the corresponding preset name. Example:

Invalid:
`{ presets: [{option: value}] }`
Valid:
`{ presets: [["presetName", {option: value}]] }`

For more detailed information on preset configuration, please see http://babeljs.io/docs/plugins/#pluginpresets-options.

#4646 修改 babel-generator 使其为 BooleanTypeAnnotation AST 节点输出 boolean 而非 bool。(@existentialism)

JavaScript
var a: Promise<boolean>[];
// instead of
var a: Promise<bool>[];

📝 文档更新

#4653 调整许可证在 GitHub 的显示方式。(@existentialism)

确保 MIT 许可证能在仓库概览页显示

🐛 错误修复

#4765 不再将 JSXMemberExpression 中的 JSXIdentifier 视为 HTML 标签。修复 #4027。(@DrewML)

JavaScript
// transform-react-inline-elements
// issue with imported components that were JSXMemberExpression
import { form } from "./export";

function ParentComponent() {
return <form.TestComponent />;
}

#4763 在 CommonJS 转换中正确处理 JSXIdentifier 到 MemberExpression 的重映射。修复 #3728。(@DrewML)

// transform-react-inline-elements
import { Modal } from "react-bootstrap";
export default CustomModal = () => <Modal.Header>foobar</Modal.Header>;

#4736 修复标签内 for-of 循环的替换问题。(@danez)

JavaScript
if ( true ) {
loop: for (let ch of []) {}
}

#4502shadow-functions 中的类属性初始化器添加特殊处理。(@motiz88)

class A {
prop1 = () => this;
static prop2 = () => this;
prop3 = () => arguments;
}

#4719 修复异步迭代器方法的错误编译。(@Jamesernator)

JavaScript
// in
class C {
async *g() { await 1; }
}
// out
class C {
g() { // was incorrectly outputting the method with a generator still `*g(){`
return _asyncGenerator.wrap(function* () {
yield _asyncGenerator.await(1);
})();
}
}

#4690 在解构转换中合并连续的 var 声明。(@motiz88)

JavaScript
// was wrapping variables in an IIFE incorrectly
for ( let i = 0, { length } = list; i < length; i++ ) {
console.log( i + ': ' + list[i] )
}

#4666 修复当构造函数默认参数引用自身或自身静态属性时的错误。(@danharper)

JavaScript
// was producing invalid code
class Ref {
static nextId = 0
constructor(id = ++Ref.nextId, n = id) {
this.id = n
}
}

assert.equal(1, new Ref().id)
assert.equal(2, new Ref().id)

#4674 正确处理剩余参数索引表达式中的副作用 (#4348)。(@motiz88)

JavaScript
function first(...values) {
let index = 0;
return values[index++]; // ++ was happening twice
}

console.log(first(1, 2));

#4669 修复带标签语句中声明语句的块级作用域转换问题。(@motiz88)

JavaScript
let x = 10;
if (1)
{
ca: let x = 20;
}

#4672 在解糖 **= 操作符时避免重复非纯模板字面量 (#4403)。(@motiz88)

JavaScript
a[`${b++}`] **= 1;

#4642 禁止将 super 赋值给引用变量。(@danez)

JavaScript
foo = {
bar() {
return super.baz **= 12;
}
}

#4670 在 transform-es2015-shorthand-properties 中保留对象方法的返回类型。(@danharper)

JavaScript
// @flow
var obj = {
method(a: string): number {
return 5 + 5;
}
};

#4668 在 transform-es2015-classes 中保留方法的返回类型 (修复 #4665)。(@danharper)

JavaScript
// @flow
class C {
m(x: number): string {
return 'a';
}
}

🏠 内部变更

#4725 从 babel-cli 中移除 babel-doctor。(@kaicataldo)

这是一次性工具(在从 v5 升级到 v6 的初始发布阶段很有帮助),不需要作为 babel-cli 的一部分。如有需要我们会将其发布为独立包。

#4764 为 test.sh 添加 TEST_DEBUG 环境变量选项,支持 Node 6 调试器。(@DrewML)

对贡献者非常有用:通过 TEST_DEBUG=true make test 在 Node v6+ 上运行 node --inspect

#4735 自动生成缺失的 expected.js 测试夹具。(@motiz88)

同样对贡献者极有帮助:如果创建了 actual.js 测试文件但缺少 expected.js,系统会自动生成(类似快照测试但输出的是 Babel 编译结果)。

#4734 将单元测试中的 "suite"/"test" 用法改为 "describe"/"it"。(@DrewML)

#4564 为测试启用 Babel 编译。(@danez)

非夹具测试现在也能被转译了!

#4732 在测试文件上运行 ESLint 并修复其中的格式错误。(@DrewML)

#4680 更新:将 Eslint 升级至 3.0 并调整 CI 构建流程 (修复 #4638)。(@gyandeeps)

通过仅在最新的 Node 版本上运行 lint 检查(ESLint 最新版已放弃对 Node < 4 的支持),可节省 CI 时间。

🎉 首次合并的 Pull Request!

🌏 贡献者:17


查看 GitHub 获取完整的更新日志!