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;
}

原文地址:https://www.cnblogs.com/yangzhou33/p/11509972.html

时间: 2024-10-31 06:29:46

import 和组件库按需引入的相关文章

组件库按需加载 借助babel-plugin-import实现

前段时间一直在基于webpack进行前端资源包的瘦身.在项目中基于路由进行代码分离,http://www.cnblogs.com/legu/p/7251562.html.对于公司内部的组件库,所有内容一次性加载源文件很大.比如登录主要就用了button和input,不需要打包table, tree这种复杂组件的. 在使用ant-design的时候,发现ant实现了按需加载,https://ant.design/docs/react/introduce-cn.所以想着自己的组件也支持相关的功能.

[转] 组件库按需加载 借助babel-plugin-import实现

前段时间一直在基于webpack进行前端资源包的瘦身.在项目中基于路由进行代码分离,http://www.cnblogs.com/legu/p/7251562.html.对于公司内部的组件库,所有内容一次性加载源文件很大.比如登录主要就用了button和input,不需要打包table, tree这种复杂组件的. 在使用ant-design的时候,发现ant实现了按需加载,https://ant.design/docs/react/introduce-cn.所以想着自己的组件也支持相关的功能.

使用babel-plugin-import实现antd组件库中的组件按需加载

Ant Design是蚂蚁金服基于react实现的一个UI 设计库,基于 npm + webpack + babel 的工作流,支持 ES2015.babel-plugin-import 可以从组件库中仅仅引入需要的模块,而不是把整个库都引入,从而提高性能. 如果使用 import { Button } from 'antd'; 的写法会引入 antd 下所有的模块. 为了提高打包编译的速度和浏览器下载资源的速度,可以通过以下的写法来只加载需要的组件: import Button from 'a

如何打造一套vue组件库

开篇组件库能帮我们节省开发精力,无需所有东西都从头开始去做,通过一个个小组件拼接起来,就得到了我们想要的最终页面.在日常开发中如果没有特定的一些业务需求,使用组件库进行开发无疑是更便捷高效,而且质量也相对更高的方案. 目前的开源组件库有很多,不管是react还是vue的体系里都有很多非常优秀的组件库,比如我经常使用的就有elementui和iview.当然也还有其他的一些组件库,他们的本质其实都是为了节省重复造基础组件这一轮子的过程.也有的公司可能会对自己公司的产品有特别的需求,不太愿意使用开源

vue脚手架中使用Vant,实现自动按需引入组件,并将px转换为rem

偶然间看到一款不错的移动端vue组件库Vant,照着官方文档敲了一下,感觉还是不错的.想着以后的项目中可能会运用到,特此记录下,方便之后使用. 现在很多的组件库为了减小代码包体积,都支持按需加载了.Vant作为一款优秀的移动端vue组件库,自然也是支持的.由于当下手机设备屏幕尺寸不一,做移动端的Web页面,需要考虑安卓/IOS的各种尺寸设备上的兼容,针对移动端设备的页面,设计与前端实现怎样做才能更好地适配不同屏幕宽度的移动设备?因而,在不同尺寸的手机设备上,页面“相对性的达到合理的展示(自适应)

微信小程序引入Vant组件库

前期准备 Vant Weapp组件库:https://youzan.github.io/vant-weapp/#/intro 1.先在微信开发者工具中打开项目的终端: 然后初始化一个package.json文件:输入命令:npm init 然后一路回车默认的即可: npm init 项目就回产生一个package.json文件: { "name": "miniprogram", "version": "1.0.0", &quo

微信小程序——引入Vant组件库

背景 在微信小程序开发过程中,使用第三方组件库,高效便捷的使用 步骤 安装npm 右键小程序根目录,打开终端 输入:npm init Next 安装vant组件 右键小程序根目录,打开终端 输入:npm i @vant/weapp -S --production 构建npm 使用npm模块 完成 原文地址:https://www.cnblogs.com/zuiyue_jing/p/12260245.html

Vue组件库 VV-UI 开始接受PR啦,有兴趣小伙伴可以一起参与开源哦。

前言: 刚开源出来的VV-UI目前刚刚起步,组件不是很多,非常欢迎大家的pr和Star.项目地址: https://github.com/VV-UI/VV-UI演示地址: https://vv-ui.github.io/VV-UI/#/目前组件库已经引入meta-info管理单页面title meta link等常用的seo问题.回归正题,如何搭建一套基于Vue的组件库呢? 1. 环境准备 我们搭建组件库,需要准备一系列环境,首先我们要考虑一下问题: 脚手架如何搭建 如何规划目录结构 如何编写文

搭建前端组件库(一)

本文梳理如何搭建和构建前端组件库. 了解几个问题 为何需要组件化? 大部分项目起源都是源于业务方的各种各样的奇葩需求.随着公司的业务发展,公司内部开始衍生出很多的B2C系统.后台系统,前端部门也疲于应对越来越多同质化的项目,这些项目在很多基础模块层.源代码存在不小的相似,甚至存在相似的业务模块. 笔者曾经所在的一个电商团队,前端成员基本每个人多做过登录注册.购物车.支付.微信登录...... 大量重复的业务代码.由于组内技术没有强制规范 本质上相同的东西,重复的去code就显得浪费. 分析这些问