在普通页面中使用React JSX时babel6、babel7的配置与选择

前言

在一些旧项目中,往往是抹水泥,需要东拼西补,于是需要 react 或者 vue 的浏览器版本,vue 相信大家都很熟悉了,这里以 react 为例探讨。

react 便捷的 jsx 语法可以极大提高生产效率,但其需要编译,是一个很严峻的问题。

babel 7

babel 7 出现后,所有下属包均归类到 @babel/*** 命名域下,相应的也有一些整合和变化,这是令人比较苦恼的。

而在 React 官方文档中,对 JSX 的 babel 编译却是使用的 babel 6 版本:

	npm install babel-cli@6 babel-preset-react-app@3

究竟如何是好,需要探究一下。

babel 6 编译 JSX

先使用官方推荐方法,安装 babel 6 与 react 的 babel 预设 babel-preset-react-app

	yarn add -D babel-cli@6 babel-preset-react-app@3

准备一段点击按钮会加一的简单 react 函数组件 src/index.jsx

const App = () => {
  const [state, setstate] = React.useState(1);

  const plus = React.useCallback(() => {
    setstate((pre) => pre + 1);
  }, []);

  return (
    <div>
      当前值:{state}
      <button onClick={plus}>点击加一</button>
    </div>
  );
};

ReactDOM.render(<App></App>, document.getElementById("app"));
编译
	yarn babel src --out-dir dist --presets react-app/prod
结果

可以看到 es6 的箭头函数被编译了,同时添加了 es6 方法的实现,JSX 也被编译了。

校验

准备 index.html 校验:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js">
  </script>
</head>

<body>

    <div id='app'></div>
    
    <script src="./dist/index.js"></script>
</body>

</html>

成功渲染,校验通过:

babel 7 编译 JSX

babel 7 的使用较复杂,如果你还不会使用 babel 7 ,可以学习以下文章:

《 babel7.4 之后 babel/polyfill 是否继续使用和怎么用的问题》

依赖
	yarn add -D @babel/core @babel/cli @babel/preset-env
	yarn add @babel/polyfill core-js

安装好依赖我们不得不提出质疑:@babel/preset-env 是 babel 默认的推荐预设,对 react JSX 是否支持?经测试,不支持,需要追加 react 预设 @babel/preset-react

	yarn add -D @babel/preset-react
配置

配置 babel 的配置文件 babel.config.json

{
  "presets": [
    [
      "@babel/env",
      {
        "useBuiltIns": "usage",
        "corejs": { "version": 3, "proposals": true }
      }
    ],
    ["@babel/preset-react"]
  ]
}
编译
	yarn babel src --out-dir dist
结果

痛心的是 @babel/polyfill 污染了全局环境,模拟了一个完整的 es2015+ 的环境。

污染全局环境先不论,含有 require 的代码是不能在普通页面中使用的,需要 webpack 配合打包。

如果你对 babel 7 + webpack 一无所知,可以学习以下文章:

《 webpack4 + babel7 项目基础配置(构建工具库或功能性库)》

webpack 打包

安装 webpack 与 babel-loader :

	yarn add -D webpack webpack-cli babel-loader

配置 webpack.config.js

const path = require("path")

function resolve(dir) {
  return path.join(__dirname, dir)
}

module.exports = {
  entry: resolve('src/index.jsx'),
  output: {
    path: resolve('dist'),
    filename: "out.js"
  },
  module: {
    rules: [
    {
      test: /\.js(x)?$/,
      loader: 'babel-loader',
      include: resolve('src'),
      exclude: /node_modules/
    }]
  }
}

打包:

	webpack --mode production

结果:

如此一来就可以使用了,打包之后的文件有 13 kb ,很明显,做过了摇树,之前我们担忧的污染问题不存在了!(完整的环境有 120 kb 以上)

总结

无论 webpack 打包之后膨胀了几倍,其优秀的兼容性是毋庸置疑的。

但从易用性角度来看,使用 babel 6 似乎是一个很快捷、易用的选择。

其他

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值