美文网首页
webpack学习第九步——babel编译es6及react

webpack学习第九步——babel编译es6及react

作者: Love小六六 | 来源:发表于2020-02-14 20:08 被阅读0次

es6 在低版本浏览器程序报错

安装相关babel

// JS和loader打通
npm install babel-loader @babel/core -D
// 将es6转化为es5
npm install @babel/preset-env -D
  • index.js用es6语法
const arr = [
    new Promise(() => {}),
    new Promise(() => {})
]

arr.map(item => console.log(item))
  • 修改webpack.config.js
module: {
    rules: [{
        test: /\.(jpg|png|gif)$/,
        use: {
            loader: "url-loader",
            options: {
                name: '[name]_[hash].[ext]',
                outputPath: 'images/',
                limit: 2048
            }
        }
    },{
        test: /\.css$/,
        use: [
            'style-loader',
            'css-loader',
            'postcss-loader'
        ]
    },{
    // 对js文件使用babel-loader 及 @babel/preset-env
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
            presets: ["@babel/preset-env"]
        }
    }]
}
  • 因为webpack-dev-server会不会打包build文件而是放到内存,不便于我们观察打包后的文件,所以修改package.json文件,将命令修改为普通打包,webpack.config.js中dev-tools也修改为"none"便于观察打包后的文件
"scripts": {
    "start": "webpack",
},
  • 打包后的文件自动将es6编译成了es5

babel-polyfill

  • polyfill 补充低版本浏览器不存在的一些内容
  • 安装
npm install @babel/polyfill -D
  • 使用 @babel/polyfill
// 引入polyfill
import "@babel/polyfill"
const arr = [
    new Promise(() => {}),
    new Promise(() => {})
]

arr.map(item => console.log(item))
  • 引入了polyfill会使打包的文件变大
  • 修改webpack.config.js,配置属性,按需引入
module: {
    rules: [{
        test: /\.(jpg|png|gif)$/,
        use: {
            loader: "url-loader",
            options: {
                name: '[name]_[hash].[ext]',
                outputPath: 'images/',
                limit: 2048
            }
        }
    },{
        test: /\.css$/,
        use: [
            'style-loader',
            'css-loader',
            'postcss-loader'
        ]
    },{
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
            presets: [["@babel/preset-env",{
                // polyfill只添加业务代码用到的特性
                useBuiltIns: 'usage'
            }]]
        }
    }]
},

配置其他属性

  • 修改webpack.config.js
{
    test: /\.js$/,
    exclude: /node_modules/,
    loader: 'babel-loader',
    options: {
        presets: [["@babel/preset-env",{
            useBuiltIns: 'usage',
            targets: {
                // 大于67版本的chrome上
                chrome: '67',
            }
        }]]
    }
}
  • chorme67以上支持es6语法,因此打包出来也是es6语法

polyfill 全局污染问题解决

  • 类库、ui组件库使用import "@babel/polyfill"会造成全局污染,因为polly-fill 在window上绑定了一些全局变量,而plugin-transform-runtime则使用闭包的形式
npm install @babel/plugin-transform-runtime -D
npm install @babel/runtime -D 
npm install @babel/runtime-corejs2 -D

  • 修改webpack.config.js
{
    test: /\.js$/,
    exclude: /node_modules/,
    loader: 'babel-loader',
    options: {
        // presets: [["@babel/preset-env",{
        //     useBuiltIns: 'usage',
        //     targets: {
        //         chrome: '67',
        //     }
        // }]]
        
        // 使用plugin-transform-runtime
        plugins: [["@babel/plugin-transform-runtime",{
            "corejs": 2,
            "helpers": true,
            "regenerator": true,
            "useESModules": false
        }]]
    }
}
  • index.js不需要去import polyfill
// import "@babel/polyfill"
const arr = [
    new Promise(() => {}),
    new Promise(() => {})
]

arr.map(item => console.log(item))
  • 打包后的文件

babelrc文件

  • babel相关的配置都可以放到单独的.babelrc文件中

  • 修改webpack.config.js

{
    test: /\.js$/,
    exclude: /node_modules/,
    loader: 'babel-loader',
}
  • 将options的内容都放置到.babelrc文件
//.babelrc文件
{
  "plugins": [["@babel/plugin-transform-runtime",{
    "corejs": 2,
    "helpers": true,
    "regenerator": true,
    "useESModules": false
  }]]
}

打包react文件

  • 先安装react相关库
npm install react react-dom -D
  • 安装react的babel,用来解析jsx语法
npm install @babel/preset-react -D
  • 修改.babelrc文件
{
  "presets": [
    [
      "@babel/preset-env",{
        "targets": {
          "chrome": "67"
        },
        "useBuiltIns": "usage"
      }
    ],
    // 增加react的babel
    "@babel/preset-react"
  ]
}
  • 修改index.js
import "@babel/polyfill"
import React,{ Component } from 'react'
import ReactDom from 'react-dom'
class App extends Component {
    render() {
        return <div>hello world</div>
    }
}

ReactDom.render(<App/>,document.getElementById('root'))
  • 打包出来的文件

相关文章

  • webpack学习第九步——babel编译es6及react

    es6 在低版本浏览器程序报错 安装相关babel index.js用es6语法 修改webpack.config...

  • 【xianyuit】20170810

    今天学习 解决React && Webpack出现无法编译 npm install babel-preset-re...

  • React 技术栈系列教程(阮一峰)

    ES6 语法:教程 Babel:教程 React:教程,示例库 Webpack:教程 React 项目脚手架:代码...

  • React技术栈

    ES6 语法:教程Babel:教程React:教程,示例库Webpack:教程React 项目脚手架:代码库Fle...

  • ES6模块化

    今天说一下ES6的模块化,使用babel进行编译。babel+webpack配置: .babelrc文件的配置 下...

  • React技术栈

    react 构建UI的框架babel 编译器webpack 打包工具 create-react-app 脚手架re...

  • es6-selfnote

    ECMAScript6(ES6)基础知识及核心原理 使用Babel编译ES6 一、下载安装Babel环境:需要电脑...

  • babel 安装错误

    babel 安装错误 因为博主在学webpack,但是webpack没法打包ES6及以上版本的JavaScript...

  • gulp构建es6项目

    项目构建介绍 ES6 项目构建 基础架构 任务自动化(gulp) 编译工具(babel、webpack) 代码实现...

  • 快速搭建 React + webpack + ES6 项目

    本 react 项目结合 babel 和 webpack-dev-server,可以转译所编写的ES6代码并且实现...

网友评论

      本文标题:webpack学习第九步——babel编译es6及react

      本文链接:https://www.haomeiwen.com/subject/xtqvmqtx.html