当前位置: 首页 > 知识库问答 >
问题:

为什么我必须在.babelrc和webpack.config.js中放置babel-presets?

赏逸春
2023-03-14

好的。我正在引导一个简单的应用程序。我使用的是flow.js。我使用的预置是babel-preset-2015、babel-preset-react和Babel-Preset-Stage-0。我必须在我的。Babelrc和WebPack.config中放置相同的预置,以便所有这些预置都能工作。例如,如果我从WebPack.config中移动它们,我会得到一个错误'React is not definited‘。如果我删除。babelrc和babel-register,我会得到一个错误,因为我使用了import和flow.js注释。为什么会这样?如果我在WebPack.config中放置预置,我应该能够删除。babelrc或相反。这就是我的代码现在所有工作时的样子(减去一些对问题不重要的文件)。

start-dev.js

require('babel-register')
require('./src/server/index.js')

index.js

/* @flow */

import Express from 'express'
import path from 'path'
import conf from '../conf/'

const APP_PORT: number = conf.APP_PORT
const PORT = process.env.PORT || APP_PORT

const app: Express = new Express()

// Middleware
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')
app.use(Express.static(path.html" target="_blank">join(__dirname, '../', 'client', 'dist')))

// Routes
app.get('*', function (req: Object, res: Object) {
  res.render('index')
})

app.listen(PORT, function () {
  console.log(`Express server is up on port ${PORT}`)
})

app.js

import React from 'react'
import ReactDOM from 'react-dom'

ReactDOM.render(
  <h1>First</h1>,
  document.getElementById('app')
)
{
  "scripts": {
    "start-dev": "set \"NODE_ENV=development\" && babel-node ./start-dev.js",
    "start": "set \"NODE_ENV=development\" && node ./start-dev.js",
    "flow": "./node_modules/.bin/flow check",
    "standard": "node_modules/.bin/standard --verbose | node_modules/.bin/snazzy"
  },
  "dependencies": {
    "ejs": "^2.5.6",
    "express": "^4.15.2",
    "react": "^15.4.2",
    "react-dom": "^15.4.2"
  },
  "devDependencies": {
    "babel-cli": "^6.24.0",
    "babel-core": "^6.24.0",
    "babel-eslint": "^7.2.1",
    "babel-loader": "^6.4.1",
    "babel-preset-es2015": "^6.24.0",
    "babel-preset-react": "^6.23.0",
    "babel-preset-stage-0": "^6.22.0",
    "babel-register": "^6.24.0",
    "eslint": "^3.18.0",
    "eslint-config-standard": "^7.1.0",
    "eslint-plugin-flowtype": "^2.30.4",
    "eslint-plugin-react": "^6.10.3",
    "flow-bin": "^0.42.0",
    "snazzy": "^6.0.0",
    "standard": "^9.0.2",
    "webpack": "^2.3.2"
  }
}
{
  "passPerPreset": true,
  "presets": [
    "es2015",
    "react",
    "stage-0"
  ]
}
'use strict'

import path from 'path'
const publicPath = path.resolve(__dirname, './src/client')

module.exports = {
  devtool: '#source-maps',
  performance: {
    hints: false
  },
  context: publicPath,
  entry: {
    bundle: './app.js'
  },
  output: {
    path: path.join(publicPath, 'dist'),
    filename: '[name].js',
    publicPath: '/dist/'
  },
  resolve: {
    extensions: ['.js', '.jsx']
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: [
            'react',
            'es2015',
            'stage-0'
          ]
        }
      }
    ]
  }
}

共有1个答案

计泉
2023-03-14

如果我在webpack.config中放置预置,我应该能够删除.babelrc或相反。

不,事实并非如此。在webpack配置中指定预置只会影响webpack,其他所有使用babel的内容(例如Babel-NodeBabel-Register等)都不会关心您的webpack配置,因此看不到它们。

相反的方式确实有效。因此,如果您有.babelrc,您可以删除webpack预置选项,因为Babel-Loader在底层使用babel,这显然尊重.babelrc

例如,如果我从WebPack.config中删除它们,我会得到一个错误React未定义

问题是您的.babelrc配置与webpack配置中的配置不同。罪魁祸首是“passperpreset”:true。使用此选项,每个预置都单独应用,而不考虑其他预置。对此,命令很重要。从巴别塔文档-插件/预置排序:

预置顺序颠倒(最后一个到第一个)。

这意味着它们将按以下顺序应用:stage-0reactES2015。当它们单独应用时,react将把JSX转换为react.createElement,因为react在作用域内,而ES2015将只把导入转换为_react2.default,因此不再定义react。这两个包之间的全部区别如下:

@@ -9470,7 +9470,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
// var React = require('react')
// var ReactDOM = require('react-dom')

-_reactDom2.default.render(React.createElement(
+_reactDom2.default.render(_react2.default.createElement(
  'h1',
  null,
  'Juhuuuu'

关于passperpreset的信息不多,但在发行说明中它被标记为实验性的,您可能应该完全避免它。

虽然如果将react预置放在列表的第一个位置会起作用,但我还是建议删除passperpreset选项,除非您有特定的理由使用它。

{
  "presets": [
    "es2015",
    "react",
    "stage-0"
  ]
}
 类似资料:
  • 在模板中,为什么要在从属名称上放置和? 从属名称到底是什么? 我有以下代码: 我遇到的问题是行。我相当肯定是一个从属名称,VC++完全正确地扼杀了它。 我还知道我应该可以在某个地方添加来告诉编译器inUnion>是一个模板ID。但具体在哪里?然后它是否应该假设inUnion是一个类模板,即命名的是一个类型而不是一个函数?

  • 问题内容: 如果我重写一个类两种方法,它必须确保,如果那么也必须是真实的。 有人可以告诉我一个简单的示例,如果违反了该示例,将会引起问题吗?我认为这与您使用该类作为Hashmap的键类型有关吗? 问题答案: 当然: 与: 从技术上讲应该是正确的,因为在两种情况下m == 3。 通常,HashMap的工作方式如下:它具有可变数量的通常称为“存储桶”的数量。存储桶的数量可以随时间变化(随着条目的添加和

  • 问题内容: 我是ReactJS的新手,并安装了node.js和babel。我不清楚为什么我们在react中使用node.js和babel。 问题答案: 有多种方法可以开始使用React.js库。虽然,最方便的方法是使用Babel + Webpack。 React使用JSX语法。Babel是一个编译器,即它将JSX转换为原始JavaScript。您可以将babel视为代码和“可执行”代码之间的中间步

  • 问题内容: 我已经使用$ .mobile.changepage在我的phonegap+jquerymobile项目中进行了重定向。但是,令我感到困惑的是,我需要将所有页面的脚本放在同一文件index.html中。否则,重定向页面将无法在其标题中执行该功能。 例如,我的index.html似乎是 然后,我的设备将重定向到似乎是 但是,该脚本将永远不会在test.html中执行。然后,将脚本放入ind

  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。

  • 根据文档,newInstance()返回一个T:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance() 所以,如果我有一个返回T的方法,为什么我必须强制转换构造函数的返回。newInstance()到T?