1. 程式人生 > >vue2+iview+require實現AMD模式下的元件化開發、按需載入

vue2+iview+require實現AMD模式下的元件化開發、按需載入

1、最近專案遇到的需求:不使用webpack,  採用老設計模式AMD,實現按需載入,元件化開發

      css樣式採用less模組化,未在webpack中配置less-loader,藉助less.js在客戶端編譯(此方法不可取,需優化)

3、設計思路:

    (1)配置require,新建main.js

      main.js中主要配置全域性js的依賴項,vue的全域性監聽器,引入公用的header、nav元件

requirejs.config({
    // baseUrl:'./',
    paths:{
        text:'lib/text',
        jquery:'lib/jquery.min',
        less:'lib/less-1.6.3.min',
        vue:'lib/vue',
        iview:'lib/iview.min',
        vueresource:'lib/vue-resource-1.3.4.min',
        httpinterface: 'httpinterface',
        loading: 'loading'
    },
    shim:{
        vue: {
            exports:'Vue'
        },
        iview: [
            'vue'
        ],
        vueresource: [
            'vue'
        ]
    }
})

// 註冊事件
require(['vue', 'iview', 'vueresource', 'loading'], function(Vue, iview, vueresource, loading) {
    Vue.use(iview);
    Vue.use(vueresource);
    // 全域性監聽器
    Vue.http.interceptors.push(function (req, next) {
        // 設定全域性token
        // let token = sessionStorage.getItem("token"); 
        // let prefix = 'Bearer_';
        // if(token) {
        //   req.headers.set('Authorization', prefix + token);
        // }
        // 請求中,顯示loading
        window.$loading.showLoading();
        next(function (res) {
          // console.log(res);
          // 請求成功,關閉loading
          window.$loading.hideLoading();
          // 這裡也可處理全域性錯誤方法
          let resBody = JSON.parse(res.bodyText);
          if(res.status === 200 && resBody.success){
            this.$Notice.destroy();
            this.$Notice.success({
                title: '提示',
                desc: '操作成功,麼麼噠!',
                duration: 2
            });
          }else{
            let msg = '';
            resBody.messages ? msg = resBody.messages : msg = '伺服器罷工了,請稍後重試!';
            this.$Notice.destroy();
            // 先執行,並且每個介面都會執行一次,然後再取到介面資料
            this.$Notice.error({
                title: '提示',
                desc: msg,
                duration: 2
            });
            
          }
        })
    })
});

// 全域性header
require(['./../components/header/header']);

// 全域性導航
require(['./../components/nav/nav']);

(2)如何定義一個公用的元件,以header為例

 第一步:定義元件的dom結構,header.html

<!-- dom -->
<div class="head-wrapper">
	<h1>這裡是頭部</h1>
</div>

     第二步:定義元件的js(註冊元件,繫結事件等)ps: 這裡要藉助require的外掛text.js,關於text.js更多

/*
* header控制器
*/
define(['vue', 'text!./../../header/header.html'], function(Vue, headerTemplate){
    Vue.component("my-header",{
        template: headerTemplate,
        data() {
            return {
                
            }
        },
        mounted() {

        },
        methods:{
            test() {

            }
        },
        computed:{

        }
    });
})

(3)開發首頁index

     第一步:定義html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>中央審批系統</title>
    <!-- css -->
    <link rel="stylesheet" type="text/css" href="../../assets/assets.css">
    <link rel="stylesheet" type="text/css" href="../../assets/iview.css">
    <!-- 服務環境下引入 -->
    <link rel="stylesheet/less" type="text/css" href="index.less" />
    <!-- require -->
    <script src="../../js/lib/require.min.js" data-main="../../js/main.js"></script>
</head>
<body>
    
    <!-- index 根節點 -->
    <div id="index" v-cloak>
        <!-- header元件 -->
        <my-header></my-header>
        <!-- 導航欄元件 -->
        <my-nav></my-nav>
        <!-- 麵包屑導航 -->
        <div class="bread-nav-wrapper">
            <Breadcrumb>
                <Breadcrumb-item href="/">
                    <Icon type="ios-home-outline"></Icon> 首頁
                </Breadcrumb-item>
                <Breadcrumb-item href="/components/breadcrumb">
                    <Icon type="social-buffer-outline"></Icon> 第一個模組
                </Breadcrumb-item>
            </Breadcrumb>
        </div>
        <!-- 內容 -->
        <div class="index-content content-wrapper">
            <h2>姓名:{{name}}</h2>
            <i-table :columns="columns1" :data="data1"></i-table>
            <Page :total="100" show-total></Page>
            <!-- 測試元件 -->
            <Tabs value="name1">
                <Tab-Pane label="標籤一" name="name1">標籤一的內容</Tab-Pane>
                <Tab-Pane label="標籤二" name="name2">標籤二的內容</Tab-Pane>
                <Tab-Pane label="標籤三" name="name3">標籤三的內容</Tab-Pane>
            </Tabs>
            <Slider v-model="value" range></Slider>
            <Input-number :max="10" :min="1" :value="1"></Input-number>
            <Date-Picker type="date" placeholder="選擇日期" style="width: 200px" ></Date-Picker>
        </div>
    </div>

    <script type="text/javascript">
        // 模組的js
        require(['./../components/index/index']);
    </script>
</body>
</html>

第二步:定義js
/*
 * index 控制器
*/
require(['vue', 'less', 'iview', 'vueresource', 'httpinterface'], function(Vue, less, iview, vueresource, httpinterface){
    // 例項化物件
    new Vue({
        el:'#index',
        data:{
            name:'川仔仔',
            value: [20, 50],
            columns1: [
                {
                    title: '姓名',
                    key: 'name'
                },
                {
                    title: '年齡',
                    key: 'age'
                },
                {
                    title: '地址',
                    key: 'address'
                }
            ],
            data1: [
                {
                    name: '王小明',
                    age: 18,
                    address: '北京市朝陽區芍藥居'
                },
                {
                    name: '張小剛',
                    age: 25,
                    address: '北京市海淀區西二旗'
                },
                {
                    name: '李小紅',
                    age: 30,
                    address: '上海市浦東新區世紀大道'
                },
                {
                    name: '周小偉',
                    age: 26,
                    address: '深圳市南山區深南大道'
                }
            ]
        },
        mounted() {
            this.getIndex(); 
            this.$Message.success('這是一條成功的提示');
            console.log(this.$HTTPINTERFACE);
        },
        methods:{
            getIndex() {
                // this.$http.post('http://47.95.232.223:8089/auth/login', {}).then((res) => {
                //     console.log(res);
                // })
            }
        },
        computed:{

        },
        components: {
          
        }
    })
})

(4)還可以使用ES6語法等,封裝公用的方法,全域性介面檔案等

(5)最終效果圖(ps: 紅色框內為封裝的公用元件)