## 代码编译

工具提供以下的代码编译能力

### ES6 转 ES5

在 0.10.101000 以及之后版本的开发工具中，会默认使用 `babel` 将开发者 `ES6` 语法代码转换为三端都能很好支持的 `ES5` 的代码，帮助开发者解决环境不同所带来的开发问题。

需要注意的是：
- 为了提高代码质量，在开启 `ES6` 转换功能的情况下，默认启用 `javasctipt` 严格模式，请参考  ["use strict"]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)

### 增强编译

在 1.02.1904282 以及之后版本的开发工具中，增加了`增强编译`的选项来增强`ES6转ES5`的能力，启用后会使用新的编译逻辑以及提供额外的选项供开发者使用。

启用`增强编译`后的编译能力的对比：

| 特性      |     原有逻辑 |   增强编译   |
| :-------- | :--------:| :------: |
| Babel版本  | babel6 | babel7 |
| Presets | es2015、stage0| env {chrome:53, ios:8}|
|Helpers| 单文件内联 | 跨文件共享 |
|Async/Await|不支持|支持|
|严格模式开关| 不支持| 支持|
|忽略文件目录|不支持|支持|
|代码压缩| uglify-js | terser|
|Babel插件| - | 一系列proposal`*`|
|polyfill| 大部分es6 | 新增三个polyfill`*` |

- 使用`preset-env`,支持最新的`ECMAScript`语法
- 共享Babel辅助函数，默认放在项目`@babel/runtime`目录，可通过[项目配置文件](projectconfig)配置
- 支持async/await语法，按需注入`regeneratorRuntime`，目录位置与辅助函数一致
- 文件首行是`// use strict disable;`时，即可禁用当前文件严格模式
- 可通过`项目配置文件`指定任意文件、目录不经过编译（如：miniprogram_npm）
- 原有逻辑支持`stage0`语法，为了向前兼容，[引入了一系列 proposal 插件](https://github.com/babel/babel/blob/master/packages/babel-preset-stage-0/README.md)
- 关于polyfill，基础库中已经引入了大量的`es6`相关的 polyfill [可参考文档](/miniprogram/dev/framework/runtime/js-support.md)，增强编译下，新增：Array.prototype.includes`(es7)`、Object.entries`(es8)`、Object.values`(es8)`

### 样式补全

开启此选项，开发工具会自动检测并补全缺失样式，保证在低版本系统上的正常显示。尽管可以规避大部分的问题 ，还是建议开发者需要在 iOS 和 Android 上分别检查小程序的真实表现。

### 压缩代码

开启此选项，开发者工具在上传代码时候将会帮助开发者压缩和混淆 `javascript` 代码，减小代码包体积。

### 代码保护

开启此选项，开发者工具会尝试对项目代码进行保护，主要是对文件进行扁平化处理并替换 `require` 引用的文件名，以下情况不适合使用此功能

1. 对于小程序只有简单页面的情况下，开启此功能效果不佳
1. 有文件超过 500kb，且其中有使用 `require` 引用项目中的文件的情况，在运行时可能会报文件没有找到
1. 动态引用的情况，如 `var a = 'somefile.js'; require(a);`
1. 将 `require` 函数赋值给其他变量的情况，如 `var a = require; a('somefile.js');`
1. 将 `require` 作为二元运算符的参数的情况，如 `require + 1;`
1. 使用 `...` 运算符且未开启 ES6 转 ES5 的情况

### 启用多核心编译

在四核及以上的电脑上此选项可见。启用此选项，会充分利用 CPU 资源来编译项目的 JS 代码，提高编译的效率。可以选择关闭此选项。
