金沙澳门官网网址_金沙国际登陆

欢迎加入金沙澳门官网网址体验更多不一样的精彩.,金沙国际登陆提供最丰厚回馈!,因为金沙澳门官网网址这里的游戏是多种多样的,为大家打造一个最专业的化的超级五星酒店。

金沙澳门官网网址 > 金沙澳门官网网址 > 大前端的自动化工厂,m实例练习

原标题:大前端的自动化工厂,m实例练习

浏览次数:136 时间:2019-11-11

制作npm插件vue-toast-m实例练习(消息弹窗)

首先我们要创建一个项目 代码是npx create-react-app之后我们开始写这个项目在写这个项目之前我们因为样式美观度的原因所以使用ant design 安装方法请去ant design官网快速上手当中复制粘贴安装命令之后我们还需要安装echarts,echarts同时也是增加页面美观度的一种操作详情同上 那么安装这些东西以后我们则正式开始做项目我们要做的时候我们先看我们要实现的效果先创建页面

图片 1
图片 2

一、使用npm插件

import VueToast  from 'vue-toast-demo-cc'

Vue.use(VueToast)


this.$toast.show("hello,toast")
//or
this.$toast.show("hello,toast",{
  duration:3000
})
// or
this.$toast.show("hello,toast",function(){
    //to-do  
})

图片 3在主页引用ant desgin同时配置路由

一. 关于babel

babel是ES6+语法的编译器,官方网址:www.babeljs.io,用于将旧版本浏览器无法识别的语法和特性转换成为ES5语法,使代码能够适用更多环境。

最初的babel使用起来是非常方便的,几乎仅使用少量的配置就可以使用,但随着工具的快速升级和代码架构的转变,babel已经裂变成非常多的部分,每个部分各司其职,这样做的好处是可以缩小生产环境的正式包的代码体积(因为可以按需引用)而加重了开发环境(开发阶段需要引入更多碎片化的插件),但劣势就是将其使用门槛提得非常高,对软件架构不熟悉的开发者难以使用。

比如babel官方网站在webpack配置的章节,提及了babe-loader,babel-corebabel-preset-env三个插件,而当开发者在webpack中实际进行配置时除了上述三个基本插件外,又会遇到babel-polyfill,babel-runtime,babel-plugin-transform-runtime等等一系列插件,或许通过查看插件说明能够理解插件的功能,但开发者却很难判断自己是否该使用这个功能或者什么时候使用。

二、项目结构

npm插件原地址:

webpack官网: 

项目github地址: 

|-- src
    |-- lib
        |-- index.js  --// 入口文件
        |-- vue-toast.vue
    |-- index.html  -- // 静态文件
|-- .babelrc
|-- package.json
|-- webpack.config.js --// 配置文件
import React, {Component} from 'react';
import '../App.css';
import {Route,Switch,Redirect} from 'react-router-dom'
import {Layout, Menu, Icon} from 'antd';
import HomeComponent from "./home";
import TableComponent from "./table";

const {Header, Sider, Content} = Layout;
const SubMenu = Menu.SubMenu;

class App extends Component {
    state = {
        collapsed: false,
    };

    toggle = () => {
        this.setState({
            collapsed: !this.state.collapsed,
        });
    }
    goPage(path){
        this.props.history.replace(path)
    }

    render() {
        return (
            <Layout>
                <Sider
                    trigger={null}
                    collapsible
                    collapsed={this.state.collapsed}
                    style={{height:"100vh"}}
                >
                    <div className="logo" >
                        <img src={'http://gaohui628.top:8084/dist/184d0d26d7b4d5e11f4045622edd2b54.jpg'} alt="图片 4"/>
                    </div>
                    <Menu theme="dark" defaultSelectedKeys={['1']} mode="inline">
                        <SubMenu
                            key="sub1"
                            title={<Icon type="user" />学生管理}
                        >
                            <Menu.Item key="1" onClick={this.goPage.bind(this,'/table')}>实训学生</Menu.Item>
                            <Menu.Item key="2" onClick={this.goPage.bind(this,'/home')}>专高学生</Menu.Item>
                            <Menu.Item key="3">专业学生</Menu.Item>
                        </SubMenu>
                        <SubMenu
                            key="sub2"
                            title={<Icon type="user" />面试题管理}
                        >
                            <Menu.Item key="4">实训学生</Menu.Item>
                            <Menu.Item key="5">专高学生</Menu.Item>
                            <Menu.Item key="6">专业学生</Menu.Item>
                        </SubMenu>
                        <SubMenu
                            key="sub3"
                            title={<Icon type="user" />项目库}
                        >
                            <Menu.Item key="7">实训学生</Menu.Item>
                            <Menu.Item key="8">专高学生</Menu.Item>
                            <Menu.Item key="9">专业学生</Menu.Item>
                        </SubMenu>
                        <SubMenu
                            key="sub4"
                            title={<Icon type="user" />snippet快捷键}
                        >
                            <Menu.Item key="10">实训学生</Menu.Item>
                            <Menu.Item key="11">专高学生</Menu.Item>
                            <Menu.Item key="12">专业学生</Menu.Item>
                        </SubMenu>
                    </Menu>
                </Sider>
                <Layout>
                    <Header style={{background: '#fff', padding: 0}}>
                        <Icon
                            className="trigger"
                            type={this.state.collapsed ? 'menu-unfold' : 'menu-fold'}
                            onClick={this.toggle}
                            style={{fontSize:"2rem",marginLeft:"0.5rem"}}
                        />
                        首页

                    </Header>
                    <Content style={{margin: '24px 16px', padding: 24, background: '#fff', minHeight: 280}}>
                        <Switch>
                            <Route path={"/home"} component={HomeComponent}></Route>
                            <Route path={'/table'} component={TableComponent}></Route>
                            <Redirect to={'/home'}/>
                        </Switch>
                    </Content>
                </Layout>
            </Layout>
        );
    }
}

export default App;

二. 基本需求推演

我们从工具设计的角度,通过问题推演的方式来看看babel的变化。

ES6标准推出时,浏览器还不能很好地支持,但ES6的许多特性和语法又很诱人,所以大家想了个办法,那就是用ES6编写代码,然后出包的时候拿个工具转换一下,变成能被更多浏览器识别的ES5语法不就行了么,于是,Babel基本模型就出现了:

图片 5

babel的功能被定义为编译工具,那么理论上来说它就可以使用编译器的通用代码框架,通过ASTparser --> traverse --> stringify 的步骤实现编译功能,在关键的traverse环节,是需要一个规则集合的,可是转码所参考的ES6的标准并不是一个定案的标准,其中每一个特性都需要经过从stage0stage4这样5个阶段才能正式定稿,只有stage-2草案(draft)阶段以上的特性才会在未来被支持,而处于这个阶段以下的标准是有可能被废的,如果一味地全部转换,不仅会降低工具效率,也会为代码未来的维护造成隐患。

那如果我们有一个工厂函数,接受数字0-4作为参数,然后返回所有经历了stage-x的规则集(是ES6规则的子集)作为规则集合,那么就可以在最终生成生产环境的代码时减小代码体积,假如在项目中通过babel_get_es6_by_stage(2)这样一个函数返回了规则集,那么正式代码中就不需要stage-0stage-1的实现代码了。基于以上的考虑,我们对Babel工具进行第一次功能剥离:

图片 6

推演继续,在对规则集进行了一次体积缩减后,我们得到了一个相对精简的规则集,它包含了诸多新的语法和方法,如果直接使用那的确很爽,毕竟引入了一个工具后就可以毫无后顾之忧地使用新特性,但对于生产环境的代码包来说,这种做法造成的代码冗余确是非常难以接受的。

用大家都熟悉的bootstrap为例,bootstrap.min.css的体积大约为120k,可你会发现很多人引入它完全是出于心里惯性,而在最后仅仅使用了非常基础的btn相关的样式类,或者仅仅为了使用col-md-4这种响应式布局的样式,所有使用到的样式可能只占了20k-30k的空间,但是却不得不为项目引进一个120k大的库,当然并不是所有的项目都会在意20k和120k之间的差别的。

那么我们就需要一个能够按更小粒度组合的方法babel_get_es6_by_rules([rule , ...]),让使用者可以选择自己所使用到的语法和方法,从而达到缩小引用库体积的目的:

图片 7

推演继续进行。处理过兼容性问题的开发者都知道,浏览器是存在版本区分的,许多特性在不同浏览器中的实现和表现都不一样,对于ES6也是这样,较高版本的浏览器对于ES6中的一些特性是已经逐步实现支持了的,如果我们的目标用户所使用的运行环境对某些ES6特性已经提供了原生支持,或者目标用户的运行环境根本就是由开发者直接封装好的,那么原先“一锅端”的转码方式里就会存在很多没有必要的部分。

比如你在规则集中选择了对Class关键字来定义类这个特性进行转码,那么babel就需要将其转码成为使用functionprototype的ES5的实现方式,但如果你的目标用户全都是程序员,几乎全都是使用高版本的chrome作为项目环境,那么上面的转码可能就是画蛇添足了。

综上所述,我们就需要为babel提供一个判断目标环境是否需要转码的方法babel_get_rule_as_need( rule_set , env_info),将经过第一次筛选后的规则集和目标用户的环境信息传入方法,对规则集进行再一次的精简,那么我们需要再次对babel进行优化:

图片 8

至此,babel便具备了针对不同的使用环境进行必要转码的能力,可这并不是问题的全部,ES6的新特性除了语法的更新外,还增加了很多原生方法或类型,例如Map,Set,Promise等这类新的全局对象,或是Array.from这类静态方法等等,语法转义并不能完成对这些特性的识别,因为无论在ES5环境还是ES6环境你都是这么写的,只有运行的时候,浏览器才会报错,告诉你某个对象或者某个方法不存在。

比如下面的代码:

function addAll() {
  return Array.from(arguments).reduce((a, b) => a + b);
}

转义后会变为:

function addAll() {
  return Array.from(arguments).reduce(function(a, b) {
    return a + b;
  });
}

然而,它依然无法随处可用因为不是所有的 JavaScript 环境都支持 Array.from。对于这一类非语法层面的特性,我们希望在工具中能够自动提供支持,这项工作有一个专有的称谓,叫做【polyfill】(或称为垫片)。

我们既可以主动提供一个polyfill列表指明需要添加的垫片插件数组,也可以采用被动的方式,在转码过程中遇到的这种API类型的新特性放进一个数组,通过babel_add_polyfill ( polyfill_list )为根据安装相应的垫片,需要注意的是,polyfill相当于为浏览器进行功能扩展,需要优先于项目业务逻辑代码运行,那么babel的逻辑框架就变成了:

图片 9

推演继续。在上面的逻辑结构中,我们只是简单地将polyfill库添加至全局变量,而全局变量是很有可能被重写而失效或是与其他第三方库发生代码冲突的。那么如果不将polyfill添加至全局,就需要将其剥离为一个具有同等功能的独立模块,通过类似于lodash或是underscore那样的方式调用,我们对逻辑结构进行再一次拆分:

图片 10

至此,我们已经完成了babel工具集基本功能的*逻辑层划分*,通过传说中的多退少补(也就是语法超前了就回退,方法不够了就打补丁)的方式来实现代码编译。

三、npm 插件制作

为了配置我们的二级路由我们还需要一个配置路由的文件夹

三. 模块划分

根据上述业务逻辑层的划分结果,我们需要对Babel工具进行代码层的模块划分:

图片 11图片 12

3.1  新建vue-toast-demo文件夹

cd vue-toast-demo   // 进入文件夹
npm init  // 初始化npm,生成package.json

输入npm init之后生成package.json

图片 13

package.json

{
  "name": "vue-toast-demo",
  "version": "1.0.0",   // 版本
  "description": "a toast plugin for mobile",
  "main": "index.js",   // 入口文件
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "repository": {   // github
    "type": "git",
    "url": "git+https://github.com/ccyinghua/vue-toast-demo.git"
  },
  "keywords": [    // 关键词
    "toast",
    "vue-toast"
  ],
  "author": "ccyinghua",  // 作者
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/ccyinghua/vue-toast-demo/issues"
  },
  "homepage": "https://github.com/ccyinghua/vue-toast-demo#readme"
}

图片 14

四. 真正的babel

如果你能够理解上述的需求推演和模块划分的章节,那么恭喜你已经掌握了babel的基本结构,我们将原本模块图中的信息更换成实际的名称或是插件,并进行一些组件划分,就可以看到真正的babel工具集的基本架构:

图片 15

当然真正的babel功能远不止这样,它为各种环境,编辑器和自动化工具提供了接口,也开放了插件开发的API给开发者,感兴趣的读者可以继续深入了解。

本文由金沙澳门官网网址发布于金沙澳门官网网址,转载请注明出处:大前端的自动化工厂,m实例练习

关键词:

上一篇:cli3脚手架的陈设以至利用,大学专科学生自学

下一篇:没有了