最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

加載 vue 遠程代碼的組件實例詳解

 更新時間:2017年11月20日 15:28:28   投稿:mrr  
vue-cli 作為 Vue 官方推薦的項目構(gòu)建腳手架,它提供了開發(fā)過程中常用的,熱重載,構(gòu)建,調(diào)試,單元測試,代碼檢測等功能。我們本次的異步遠端組件將基于 vue-cli 開發(fā)

在我們的 vue 項目中(特別是后臺系統(tǒng)),總會出現(xiàn)一些需要多業(yè)務(wù)線共同開發(fā)同一個項目的場景,如果各業(yè)務(wù)團隊向框架中提供一些私有的展示組件,但是這些組件并不能和框架一起打包,因為框架不能因為某個私有模塊的頻繁變更而重復(fù)構(gòu)建發(fā)布。在這種場景下我們需要一個加載遠程異步代碼的組件來完成將這些組件加載到框架中。

vue-cli 作為 Vue 官方推薦的項目構(gòu)建腳手架,它提供了開發(fā)過程中常用的,熱重載,構(gòu)建,調(diào)試,單元測試,代碼檢測等功能。我們本次的異步遠端組件將基于 vue-cli 開發(fā)。

需求分析

  1. 如何加載遠端的代碼?
  2. 如何注冊加載后的代碼到框架中。
  3. 父組件如何和遠端引入的組件通信。
  4. 遠端代碼如何復(fù)用框架中已引入的庫。
  5. 避免因遠端代碼被類似 v-for 多次調(diào)用導(dǎo)致的不必要請求。

加載遠端代碼

遠端代碼應(yīng)該存儲在一個可訪問的 URL 上,這樣我們通過 Axios 類似的 HTTP client 請求這個鏈接拿到源碼。

import Axios from 'axios';
export default {
 name: 'SyncComponent',
 props: {
  // 父組件提供請求地址
  url: {
   type: String,
   default: ''
  }
 },
 data() {
  return {
   resData: ''
  };
 },
 async mounted() {
  if (!this.url) return;
  const res = await Axios.get(this.url); // 我們在組件掛載完成時,請求遠端代碼并存儲結(jié)果。
  this.resData = res.data;
 }
};

以上是基礎(chǔ)代碼 為了方便 一下例子中 我將省略重復(fù)的代碼部分。

注冊代碼到框架中

這部分有些繁瑣,涉及到多個問題:

瀏覽器并不支持 .vue 模板 或 ES.next 語法,模塊需要編譯后才可以使用。

處理這部分比較簡單,我們自己定義一個webpack配置文件來打包這些模板。

// 在 build 目錄下新建 webpack.sync-components.prod.conf.js 文件
const webpack = require('webpack');
const path = require('path');
const utils = require('./utils');
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
function resolve(dir) {
 return path.join(__dirname, '..', dir)
}
module.exports = {
 // 此處引入要打包的組件
 entry: {
  componentA: resolve('/src/views/component-a.vue')
 },
 // 輸出到靜態(tài)目錄下
 output: {
  path: resolve('/static/'),
  filename: '[name].js',
 },
 resolve: {
  extensions: ['.js', '.vue', '.json'],
  alias: {
   'vue$': 'vue/dist/vue.esm.js',
   '@': resolve('src'),
  }
 },
 module: {
  rules: [
   {
    test: /\.vue$/,
    loader: 'vue-loader',
    options: {
     esModule: false, // ****** vue-loader v13 更新 默認值為 true v12及之前版本為 false, 此項配置影響 vue 自身異步組件寫法以及 webpack 打包結(jié)果
     loaders: utils.cssLoaders({
      sourceMap: true,
      extract: false     // css 不做提取
     }),
     transformToRequire: {
      video: 'src',
      source: 'src',
      img: 'src',
      image: 'xlink:href'
     }
    }
   },
   {
    test: /\.js$/,
    loader: 'babel-loader',
    include: [resolve('src'), resolve('test')]
   },
   {
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     name: utils.assetsPath('img/[name].[hash:7].[ext]')
    }
   },
   {
    test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     name: utils.assetsPath('media/[name].[hash:7].[ext]')
    }
   },
   {
    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
    }
   }
  ]
 },
 plugins: [
  new webpack.DefinePlugin({
   'process.env.NODE_ENV': '"production"'
  }),
  // 壓縮JS
  new webpack.optimize.UglifyJsPlugin({
   compress: false,
   sourceMap: true
  }),
  // 壓縮CSS 注意不做提取
  new OptimizeCSSPlugin({
   cssProcessorOptions: {
    safe: true
   }
  })
 ]
};

至此我們的模塊已經(jīng)被編譯成框架可以識別的文件。

1.如何將字符串轉(zhuǎn)換成js對象。

new Function。
async mounted() {
 if (!this.url) return;
 const res = await Axios.get(this.url);
 let Fn = Function;
 this.mode = new Fn(`return ${res.data}`)();
}

1.轉(zhuǎn)換后的js對象并不能被vue識別。

有兩種可能會導(dǎo)致這個問題:

// vue-loader v13 esModule 更新 默認值為 true, v12及之前版本為 false, 此項配置影響 vue 自身異步組件寫法以及 webpack 打包結(jié)果
{
 test: /\.vue$/,
 loader: 'vue-loader',
 options: {
  esModule: false
  ... 以下省略千軍萬碼
 }
}
// UglifyJs 需要取消變量名替換配置,此配置并不會極大影響壓縮率
new webpack.optimize.UglifyJsPlugin({
 compress: false,
 sourceMap: true
})

至此 遠程組件就被引入到框架中了。

父組件如何和遠端引入的組件通信

這里有一個問題,從 view組件 到 遠程異步加載組件 再到 實際業(yè)務(wù)組件 通信一共三層,中間層 遠程異步組件 作為公共組件不可被修改,需要 view組件 直接向 實際業(yè)務(wù)組件 通信。vuex 和 eventBus 方案都過于繁瑣,這里我們采用 $attrs 和 $listeners(vue v2.4+), 來實現(xiàn) “fallthrough”(vue組件跨層級通信)。

// 修改 sync-component.vue 組件
// 新增 v-bind="$attrs" v-on="$listeners"
<component
 :is="mode"
 v-bind="$attrs"
 v-on="$listeners">
</component>
// inheritAttrs: true
export default {
 name: 'SyncComponent',
 props: {
  // 父組件提供請求地址
  url: {
   type: String,
   default: ''
  }
 },
 inheritAttrs: true
 ... 以下省略千軍萬碼
}

遠端代碼如何復(fù)用框架中已引入的庫

我們不希望看到遠端組件和框架中存在較大庫或插件的重復(fù)的引入,這部分內(nèi)容尚處在實踐階段,主要思路是把公共庫掛載到Vue原型鏈上實現(xiàn)組件公共復(fù)用 Vue.prototype.$xxx。

// 全局添加 axios 對象
import axios from 'axios';
Vue.prototype.$http = axios;

引入的遠程組件可以訪問到框架中的公共包了,這時候還需要配置 webpack 使遠程組件打包時不要包含公共包的代碼。

// webpack.sync-components.prod.conf.js 添加
externals: {
 vue: 'vue',
 'element-ui': 'element-ui',
 axios: 'axios'
}

避免因遠端代碼被類似 v-for 多次調(diào)用導(dǎo)致的不必要請求。

這部分我們直接用一個全局變量做字典,存儲 以 請求地址:數(shù)據(jù) 為子項的數(shù)組。

async mounted() {
 if (!this.url) return;
 // Cache 緩存 根據(jù) url 參數(shù)
 if (!window.SyncComponentCache) {
  window.SyncComponentCache = {};
 }
 let res;
 if (!window.SyncComponentCache[this.url]) {
  window.SyncComponentCache[this.url] = Axios.get(this.url);
  res = await window.SyncComponentCache[this.url];
 } else {
  res = await window.SyncComponentCache[this.url];
 }
 let Fn = Function;
 this.mode = new Fn(`return ${res.data}`)();
 console.log(this.mode);
}

至此,異步遠程組件就可以加載并和框架進行通信了。

本文中的源碼請訪問 github 獲取,組件已經(jīng)發(fā)布到NPM 上,可以直接安裝。

總結(jié)

以上所述是小編給大家介紹的加載 vue 遠程代碼的組件,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 前端低代碼form-generator實現(xiàn)及新增自定義組件詳解

    前端低代碼form-generator實現(xiàn)及新增自定義組件詳解

    這篇文章主要給大家介紹了關(guān)于前端低代碼form-generator實現(xiàn)及新增自定義組件的相關(guān)資料,form-generator是一個開源的表單生成器,可以幫助我們快速構(gòu)建各種表單頁面,需要的朋友可以參考下
    2023-11-11
  • Element輸入框帶歷史查詢記錄的實現(xiàn)示例

    Element輸入框帶歷史查詢記錄的實現(xiàn)示例

    這篇文章主要介紹了Element輸入框帶歷史查詢記錄的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • antd form表單數(shù)據(jù)回顯操作

    antd form表單數(shù)據(jù)回顯操作

    這篇文章主要介紹了antd form表單數(shù)據(jù)回顯操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 從零寫vue日歷組件

    從零寫vue日歷組件

    最近做項目遇到一個需求,需要制作一個定制化的日歷組件,本文主要介紹了從零寫vue日歷組件,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 基于element-ui的rules中正則表達式

    基于element-ui的rules中正則表達式

    今天小編就為大家分享一篇基于element-ui的rules中正則表達式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue版本vue2.9.6升級到vue3.0的詳細步驟

    Vue版本vue2.9.6升級到vue3.0的詳細步驟

    vue版本升級相信大家應(yīng)該都遇到過,下面這篇文章主要給大家介紹了關(guān)于Vue版本vue2.9.6升級到vue3.0的詳細步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Vue3+TypeScript埋點方面的應(yīng)用實踐

    Vue3+TypeScript埋點方面的應(yīng)用實踐

    本文詳細闡述了如何在Vue3中使用TypeScript實現(xiàn)埋點功能,包括全局注冊$track插件、Mixin實現(xiàn)全局埋點等,隨著Vue3的逐漸普及,在實際工作中采用Vue3+TypeScript實現(xiàn)埋點將會變得越來越流行
    2023-08-08
  • 基于Vue3和Element Plus實現(xiàn)可擴展的表格組件

    基于Vue3和Element Plus實現(xiàn)可擴展的表格組件

    在開發(fā)過程中,我們經(jīng)常需要創(chuàng)建具有復(fù)雜功能的表格組件,本文將介紹如何使用 Vue 3 和 Element Plus 庫來構(gòu)建一個可擴展的表格組件,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • vue 中url 鏈接左邊的小圖標更改問題

    vue 中url 鏈接左邊的小圖標更改問題

    這篇文章主要介紹了vue 中url 鏈接左邊的小圖標更改問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Vue3?響應(yīng)式高階用法之customRef()的使用

    Vue3?響應(yīng)式高階用法之customRef()的使用

    customRef()是Vue3的高級工具,允許開發(fā)者創(chuàng)建具有復(fù)雜依賴跟蹤和自定義更新邏輯的ref對象,本文詳細介紹了customRef()的使用場景、基本用法、功能詳解以及最佳實踐,包括防抖、異步更新等用例,旨在幫助開發(fā)者更好地理解和使用這一強大功能
    2024-09-09

最新評論

浙江省| 云和县| 犍为县| 嘉荫县| 云南省| 萝北县| 航空| 紫云| 黎城县| 安陆市| 胶州市| 潞城市| 天峻县| 宁晋县| 葵青区| 崇仁县| 通山县| 自治县| 南乐县| 杂多县| 伊通| 九龙城区| 新宾| 宁晋县| 普安县| 广德县| 兴安盟| 拉萨市| 分宜县| 会泽县| 合江县| 长岛县| 固安县| 宁晋县| 沁源县| 兴隆县| 仁布县| 土默特左旗| 济南市| 万荣县| 孝感市|