第三節: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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM