第三节:Babel的使用、Webpack集成Babel、单文件Vue打包

一. Babel的使用

1. 为什么要用babel?

 比如我们想使用ES6+的语法,想要使用TypeScript,但是很多旧浏览器又不支持这些新语法,这个时候就需要使用babel了。

 Babel是一个工具链,主要用于旧浏览器或者环境中将 ECMAScript 2015+ 代码转换为向后兼容版本的JavaScript;包括:语法转换、源代码转换等。

2. babel的安装使用

(1). 安装

 这里以局部安装为例,运行指令【npm install @babel/cli @babel/core -D】,其中:

 @babel/core:babel的核心代码,必须安装
 @babel/cli:可以让我们在命令行使用babel;

(2). 使用

 【npx babel test1/newjs --out-dir test1/oldjs】,表示将test1/newjs文件夹里的文件都转换到test1/oldjs文件夹中。(ps: 该指令也可以直接定位到文件来转换)

newjs文件夹里的ypf1.js文件如下:

// 需要将const 转换成 var
const message = "Hello World";
const names = ["abc", "cba", "nba"];

names.forEach(item => console.log(item));    // 箭头函数 转成 function普通函数

结果:

  转换后的文件没有任何变化,这是因为没有安装相关插件

3. 插件的使用

 @babel/plugin-transform-arrow-functions :转换箭头函数的插件。

 @babel/plugin-transform-block-scoping: 转换const的插件

(1). 安装两个插件

 【npm install @babel/plugin-transform-arrow-functions -D】 【npm install @babel/plugin-transform-block-scoping -D】

(2). 运行指令进行转换

   【npx babel test1/newjs --out-dir test1/oldjs --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functions】

转换后的代码如下:

// 需要将const 转换成 var
var message = "Hello World";
var names = ["abc", "cba", "nba"];
names.forEach(function (item) {
  return console.log(item);
}); // 箭头函数 转成 function普通函数

4. babel的预设(推荐!!)

(1). 背景:

  总不能有一种写法就安装一个转换插件吧,太繁琐,所以这里babel给预设,将常用的转换都加在预设里。

(2). 使用

 A. 运行指令【npm install @babel/preset-env -D】,进行预设安装。

 B. 运行指令【npx babel test1/newjs --out-dir test1/oldjs --presets=@babel/preset-env】,进行转换。

5. babel的底层原理 

 我们可以将babel看成就是一个编译器Babel编译器的作用就是将我们的源代码,转换成浏览器可以直接识别的另外一段源代码;Babel编译器也有三个阶段:解析阶段(Parsing)转换阶段(Transformation)生成阶段(Code Generation)。

 

二. Webpack集成babel

1. 安装babel-loader

 【npm install @babel/core -D】

 【npm install babel-loader -D】   

PS:babel-loader需要依赖 @babel/core。

2. 插件的模式配置

 安装两个插件:【npm install @babel/plugin-transform-arrow-functions -D】 【npm install @babel/plugin-transform-block-scoping -D】

 代码配置:

            // babel转换(插件模式)
            {
                test: /\.js$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        plugins: [
                            "@babel/plugin-transform-arrow-functions",
                            "@babel/plugin-transform-block-scoping",
                        ]
                    }
                }
            }

  将ypf1.js复制到src/js文件夹里,然后导入到main.js文件里。将babel配置中mode改为开发模式development,方便查看打包生成的源代码。

运行指令【npm run build】,然后查看打包后的文件:均已转换。

3. 预设的模式配置 (推荐)

 webpack提供一个preset,webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel。

 指令安装预设组件:【npm install @babel/preset-env -D】

 配置文件:

            // babel转换(预设模式)
            {
                test: /\.js$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: [
                            "@babel/preset-env"
                        ]
                    }
                }
            }

 然后运行进行打包,就自动转换了,后面完全同上。 

 4. 单独抽离babel配置文件

  我们可以将babel的配置文件单独拿出来,命名为:babel.config.js

webpack.config.js中代码

    {
                test: /\.js$/,
                use: {
                    loader: "babel-loader",                    
                }
     }

babel.config.js代码如下: 

// 单独抽离babel的配置文件,采用预设的模式
module.exports = {
  presets: [
    "@babel/preset-env"
  ]
}

 

三. 单文件Vue打包

1. 相关说明

(1). vue打包后不同版本解析

(2). 运行时+编译器 vs 仅运行时

 

(3). 全局标识配置 

 下图是两个特性的标识,一个是使用Vue的Options,表示时候支持Vue2,一个是Production模式下是否支持devtools工具;虽然他们都有默认值,但是强烈建议我们手动对他们进行配置。

代码配置: 借助DefinePlugin插件。

plugins: [new DefinePlugin({
            BASE_URL: "'./'",
            __VUE_OPTIONS_API__: true,
            __VUE_PROD_DEVTOOLS__: false
        })
    ]

2. 实战演练

(1). vue代码准备

A. 安装vue为生产依赖

【npm install vue@3.2.12】  (等价  【npm install vue@3.2.12 -S】)

B. 准备App.vue和HelloWorld.vue

 ① App.vue中调用HelloWorld

HelloWorld组件

<template>
    <h3>{{msg}}</h3>
</template>

<script>
    export default{
        data(){
            return{
                msg:'我是hello-world组件'
            }
        }
    }
</script>

<style>
</style>
View Code

App组件

<template>
    <div>
        <h3>我是vue单文件渲染出来了的</h3>
        <h3>{{msg}}</h3>
        <hello-world></hello-world>
    </div>
</template>

<script>
    // 导入组件
    import HelloWorld from './HelloWorld.vue'
    
    export default {
        components:{
            HelloWorld
        },
        data() {
            return {
                msg: "hello vue3"
            }
        }
    }
</script>

<style scoped="scoped">
    h3{
        color: cornflowerblue;
        font-weight: bold;
    }
</style>
View Code

 ② 在main.js中调用App.vue

// 调用vue相关
import {createApp} from 'vue';
import App from './vue/App.vue';

const app=createApp(App);
app.mount('#app');

(2). 相关配置

A. 安装loader

npm install vue-loader@16.5.0 -D

npm install @vue/compiler-sfc@3.2.11 -D 】用于解析template。

B. babel相关配置 

(配置vue-loader 和 插件 VueLoaderPlugin)

// 这里必须通过 commonjs的写法配置,不能写 ES6的写法
const { VueLoaderPlugin } = require('vue-loader/dist/index'); module.exports = { module: { rules: [// Vue解析打包 { test: /\.vue$/, loader: "vue-loader" } ] }, plugins: [

    new VueLoaderPlugin() ] }

(3). 打包运行测试 

 运行指令【npm run build】,浏览器中运行如下图:

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2021-09-18 14:50  Yaopengfei  阅读(1110)  评论(2编辑  收藏  举报