使用babel-preset-env的Babel似乎忽略了浏览器列表配置

Hun*_*ker 6 cross-browser package.json babeljs npm-scripts babel-preset-env

我正在用npm脚本中的browserslist测试Babel。

这是我当前的package.json,Babel正在按照我的期望进行操作:

{
  "name": "npm-scripts-igloo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "devserver": "live-server",
    "watch-sass": "node-sass sass/style.scss css/style.css --output-style expanded --watch",
    "compile-sass": "node-sass sass/style.scss css/style.compiled.css --output-style expanded",
    "prefix-css": "postcss css/style.compiled.css --use autoprefixer -o css/style.prefix.css",
    "compress-css": "node-sass css/style.prefix.css css/style.min.css --output-style compressed",
    "build-css": "npm-run-all compile-sass prefix-css compress-css",
    "babel": "babel app.js --watch -o js/app.compiled.js",
    "start": "npm-run-all -p devserver watch-sass babel"
  },
  "browserslist": [
    "last 5 versions"
  ],
  "babel": {
    "presets": [
      [
        "env",
        {
          "targets": {
            "browsers": [
              "cover 99.5%"
            ]
          }
        }
      ]
    ]
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@fortawesome/fontawesome-free": "^5.6.1",
    "autoprefixer": "^9.4.7",
    "babel-cli": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "live-server": "^1.2.1",
    "node-sass": "^4.11.0",
    "npm-run-all": "^4.1.5",
    "postcss-cli": "^6.1.1"
  }
}
Run Code Online (Sandbox Code Playgroud)

我没有使用.babelrc文件或Babel的任何其他配置。

我尝试使用browserslist键锁定Edge 16:

"browserslist": [
    "Edge 16"
  ]
Run Code Online (Sandbox Code Playgroud)

使用此配置,Babel不应将其转换constvar,而是按如下说明进行转换: Babel不会更改const,因为Edge 16支持它 https://github.com/browserslist/browserslist-example

但是,如果我使用babel键锁定Edge 16:

"babel": {
    "presets": [
      [
        "env",
        {
          "targets": {
            "browsers": [
              "Edge 16"
            ]
          }
        }
      ]
    ]
  }
Run Code Online (Sandbox Code Playgroud)

那么Babel不会正确地更改constvarEdge 16 ,因为Edge 16支持它。

我更喜欢使用browserslist键,因为这是推荐的做法 https://github.com/browserslist/browserslist

另外,我然后可以简单地与autoprefixer共享此browserslist选项,这应该是这样工作的。

但是,问题在于Babel似乎忽略了browserslist键。

如果我使用包含以下内容的.browserslistrc文件,则情况也是如此:

Edge 16
Run Code Online (Sandbox Code Playgroud)

此幻灯片上带有星号的注释:https : //slides.com/ai/browserslist#/14 报告: 仅Babel 7支持配置文件

因此,我尝试将Babel更新为v7:

npm install @babel/core -D
Run Code Online (Sandbox Code Playgroud)

这在devDependencies中产生了以下内容:

"@babel/core": "^7.3.4"
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎没有任何区别。

因此,我的问题是:

  1. 为什么浏览器列表键似乎没有影响Babel?我的语法有问题吗?

  2. 在package.json中的browserslist键出现在哪里有关系吗?即关键顺序重要吗?

den*_*bot 5

聚会有点晚了,但我正在阅读文档并发现了这一点:

“默认情况下@babel/preset-env将使用browserslist配置源,除非设置了targets或ignoreBrowserslistConfig选项。”

来源:这里

因此,在您的情况下,您需要摆脱targets财产,否则它将优先,并且.browserlistrc财产browserslistpackage.json不会生效。

希望能帮助到你!


小智 -2

它对我有用 babel@7.6.0 并在 .babelrc fie 中进行以下配置

'@babel/preset-env', {
   'useBuiltIns': 'usage',
   'corejs': 3,
   'targets': {
     'browsers': ['chrome 74']
    }
 }
Run Code Online (Sandbox Code Playgroud)

在这里找到更多信息。

or 组合符可以使用关键字 or 以及 ,。最后 1 个版本或 > 1% 等于最后 1 个版本,> 1%。

还支持查询组合来执行前一个查询的交集:最后 1 个版本和 > 1%。