zoukankan      html  css  js  c++  java
  • 第三节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    2017NOIP游记 (格式有点炸)
    Qtree3
    [P2769] 猴子上树
    [Usaco2005 Dec]Cleaning Shifts 清理牛棚
    [NOIP2014] 解方程
    [ZJOI2012] 灾难
    [洛谷P3941] 入阵曲
    [SCOI2009] 最长距离
    [JLOI2011] 飞行路线
    虚拟化数电底层
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/15308679.html
Copyright © 2011-2022 走看看