import 和组件库按需引入
概述
今天查资料查到了一些有趣的东西,记录下来,供以后开发时参考,相信对其他人也有用。
参考资料:
import、require、export、module.exports 混合使用详解
从 import 讲起
import { button, Select } from 'element-ui'这段代码到底发生了什么?
babel 会将这段代码进行转码,转码之后是这个样子:
var a = require('element-ui');
var Button = a.Button;
var Select = a.Select;
所以,就算我们只想使用 element-ui 的 button 和 Select 这2个组件,但是实际上,我们把整个 elment-ui 库引入进来了。
babel-plugin-component 做了什么
我们知道,在 element-ui 的文档里面强调,如果要使用按需加载,就要使用 babel-plugin-component 库。那么 babel-plugin-component 库又做了什么?简单来说,它把上面的代码转化成了下面的样子:
import Button from 'element-ui/lib/button'
import Select from 'element-ui/lib/select'
这样就只会引入 Button 和 Select 这两个组件了。
类似的,e-charts 在按需引入组件的时候是这么引入的,也是一样的道理。
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/line';
import 'echarts/lib/chart/scatter';
import 'echarts/lib/chart/effectScatter';
import 'echarts/lib/chart/treemap';
所以,所有支持按需引入的库,都可以用上面的方法进行按需引入组件。
一个问题
如果我们有一个需求,就是在 app 加载的时候不引入 element-ui 库,然后在/admin这个路由下面才引入 element-ui ,那要怎么做呢?
在 main.js 使用各种形式的按需加载肯定是不行的,因为会打包进入 app.js 里面去,从而在初次加载 app 的时候加载。
在/admin这个路由下,各个组件用到 element-ui 的组件的时候,各自按需加载。这个方法是可行的,但是非常繁琐,每次用到 element-ui 的组件都需要引入一下,然后挂载一下。
我选择的方法是,在/admin这个路由的组件下面,按需加载全部需要的 element-ui 组件,示例代码如下:
// admin.element.js
import Vue from 'vue';
import Row from 'element-ui/lib/row';
import Col from 'element-ui/lib/col';
import Table from 'element-ui/lib/table';
import TableColumn from 'element-ui/lib/table-column';
import Button from 'element-ui/lib/button';
import Footer from 'element-ui/lib/footer';
import Form from 'element-ui/lib/form';
import FormItem from 'element-ui/lib/form-item';
import Input from 'element-ui/lib/input';
import Menu from 'element-ui/lib/menu';
import Submenu from 'element-ui/lib/submenu';
import MenuItem from 'element-ui/lib/menu-item';
import Loading from 'element-ui/lib/loading';
import Message from 'element-ui/lib/message';
const components = [
Row,
Col,
Table,
TableColumn,
Button,
Footer,
Form,
FormItem,
Input,
Menu,
Submenu,
MenuItem,
];
components.forEach((component) => {
Vue.component(component.name, component);
});
Vue.use(Loading.directive);
Vue.prototype.$message = Message;
内存泄漏
粗看上面的代码是没有问题的,但是仔细想的话,如果每次跳转到/admin路由下面的话,那不是每次都会安装引入的这些组件吗?那如果跳转多次就会安装多次,造成内存泄漏啊~~~
虽然说 Vue 本身的插件安装机制已经避免了这种情况,但是我们还是建议加上一行判断代码:
import Vue from 'vue';
import Row from 'element-ui/lib/row';
import Col from 'element-ui/lib/col';
import Table from 'element-ui/lib/table';
import TableColumn from 'element-ui/lib/table-column';
import Button from 'element-ui/lib/button';
import Footer from 'element-ui/lib/footer';
import Form from 'element-ui/lib/form';
import FormItem from 'element-ui/lib/form-item';
import Input from 'element-ui/lib/input';
import Menu from 'element-ui/lib/menu';
import Submenu from 'element-ui/lib/submenu';
import MenuItem from 'element-ui/lib/menu-item';
import Loading from 'element-ui/lib/loading';
import Message from 'element-ui/lib/message';
// hack: 防止多次引入导致内存泄漏
if (!Vue.hasAdminPageImportedElement) {
const components = [
Row,
Col,
Table,
TableColumn,
Button,
Footer,
Form,
FormItem,
Input,
Menu,
Submenu,
MenuItem,
];
components.forEach((component) => {
Vue.component(component.name, component);
});
Vue.use(Loading.directive);
Vue.prototype.$message = Message;
Vue.hasAdminPageImportedElement = true;
}
import 和组件库按需引入的更多相关文章
- [转] 组件库按需加载 借助babel-plugin-import实现
前段时间一直在基于webpack进行前端资源包的瘦身.在项目中基于路由进行代码分离,http://www.cnblogs.com/legu/p/7251562.html.对于公司内部的组件库,所有内容 ...
- 组件库按需加载 借助babel-plugin-import实现
前段时间一直在基于webpack进行前端资源包的瘦身.在项目中基于路由进行代码分离,http://www.cnblogs.com/legu/p/7251562.html.对于公司内部的组件库,所有内容 ...
- vue-cli3.0安装element-ui组件及按需引入element-ui组件
在VUE-CLI 3下的第一个Element-ui项目(菜鸟专用) (https://www.cnblogs.com/xzqyun/p/10780659.html) 上面这个链接是vue-cli3.0 ...
- 使用webpack4搭建一个基于Vue的组件库
组内负责的几个项目都有一些一样的公共组件,所以就着手搭建了个公共组件开发脚手架,第一次开发 library,所以是参考着 iview 的配置来搭建的.记录如何使用webpack4搭建一个library ...
- 基于Vue的npm组件库
前言(*❦ω❦) 思维导图可能有点高糊,有点太大了,项目和导图文件放到github或giteee上,这个思维导图也是我文章的架构,思维导图是用FeHelper插件生成的,这个是一款开源chrome插件 ...
- 手把手教你搭建自己的Angular组件库 - DevUI
摘要:DevUI 是一款面向企业中后台产品的开源前端解决方案,它倡导沉浸.灵活.至简的设计价值观,提倡设计者为真实的需求服务,为多数人的设计,拒绝哗众取宠.取悦眼球的设计.如果你正在开发 ToB 的工 ...
- 如何快速为团队打造自己的组件库(上)—— Element 源码架构
文章已收录到 github,欢迎 Watch 和 Star. 简介 详细讲解了 ElementUI 的源码架构,为下一步基于 ElementUI 打造团队自己的组件库打好坚实的基础. 如何快速为团队打 ...
- 如何写一个自己的组件库,打成NPM包,并上传到NPM远程
1.首先使用vue create my_project 构建一个自己的Vue项目 2.vue.config.js和package.json配置如下,做了些修改 const path = require ...
- vue - 搭建 webapp 自适应项目-使用 vant 组件库 并 可自动调节大小
1.创建个vue 项目,这里不详细写怎么创建,参考 vue - 指令创建 vue工程 - 岑惜 - 博客园 (cnblogs.com) https://www.cnblogs.com/c2g52013 ...
随机推荐
- ceph分布式存储简介
一.Ceph简介: 什么是分布式存储? 我在一个环境当中,有很多很多的服务器,服务器上也有它自己很多的硬盘,我通过软件的形式把若干服务器都收集起来,部署成一个软件,在这个逻辑的软件里可以同时看到我若干 ...
- Hash基础
BKDR Hash: 选取恰当的进制,可以把字符串中的字符看成一个大数字中的每一位数字,不过比较字符串和比较大数字的复杂度并没有什么区别 首先不要把任意字符对应到数字0,比如假如把a对应到数字0,那么 ...
- 性能测试:oprofile的学习使用
一.oprofile简介 Oprofile是linux上的性能监测工具,有人说是性能测试的神器.通过CPU硬件提供的性能计数器对事件进行采样,从代码层面分析程序的性能消耗情况,找出程序性能的问题点. ...
- 问题:关于2.3 jmu-Java-02基本语法-03-身份证排序 (9 分)
输出未能排序 import java.util.Scanner; import java.util.Arrays; public class Main { pu ...
- Java基本的程序结构设计 控制流程
控制流程 java的控制流程和C和C++基本一致,只是不能使用goto语句,不过break语句可以带标签,实现从内层循环跳出的目的.标签可以放在for或者while前面.如下: package com ...
- DRF介绍,DRF项目开发,DRF项目的视图类的dispatch源码解析
目录 一.DRF介绍 1. 什么是DRF 2. 为什么要用DRF (1)使用DRF的原因 (2)站在开发者的角度来说用DRF的好处(暂时列举这么多) 二.用DRF开发后端项目 三.APIView请求生 ...
- day_14 匿名函数与内置函数连用 作业题
''' 要求: 从文件中取出每一条记录放入列表中,列表的每个元素都是` {'name':'egon','sex':'male','age':18,'salary':3000}`的形式 ''' all_ ...
- Raspberry Pi3驱动Oled ssh1106屏
Raspberry Pi3可以直接使用GPIO接口驱动OLED屏 一.接线 根据网上随便找的图可以看到树莓派3的GPIO接口引脚顺序 PS:26pin的GPIO为前26针 根据OLED屏的引脚说明,如 ...
- WIN 7 的vs2008 试用版评估期结束的解决方法
1. 在VS2008安装目录下把Setup/setup.sdb文件中的 [Product Key] T2CRQGDKBVW7KJR8C6CKXMW3D 改成 [Product Key] PYHYPWX ...
- The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs
题目:https://nanti.jisuanke.com/t/41399 思路:差分数组 区间内操作次数为奇数次则灯为打开状态 #include<bits/stdc++.h> using ...