前言

在与同事协作开发的过程中,见识到了不少“骚操作”。因为之前都没用过,所以我愿称之为“高级技巧”!

Vue.extend

在交互过程中,有个需求就是点击图标弹出相关信息的弹窗,并且能够同时打开多个。这时就可以用Vue.extend方法手动挂载弹窗组件。

举例:

// 目录结构
/registry
/videoDialog
videoDialog.vue
index.js
/XXXDialog
···
index.js // videoDialog/index.js
import Vue from 'vue';
import videoDialog from './videoDialog.vue'; const videoDialogConstructor = Vue.extend(videoDialog); function videoDialogInstance (data) {
const dialogInstance = new videoDialogConstructor({
el: document.createElement('div'),
data () ({
...data
})
});
document.body.appendChild(dialogInstance.$el);
} export default function videoDialogDom () {
Vue.prototype.$videoDom = videoDialogInstance
} /index.js
import videoDialog from './videoDialog';
Vue.use(videoDialog); // 用法
// video.vue
export default {
method: {
click() {
this.$video();
}
}
}

在css中使用相对路径

在vue项目中,通过在webpack配置文件中配置alias属性增加文件路径的别名

// webpack.config.js
resolve: {
alias: {
'@': resolve('src'),
'@assets': resolve('src/assets')
}
} // 在js文件中可以使用
import component from '@/component/xxx' // 但是在css文件中使用'@assets/images/xxx.png'却会报错
background-image: url(@assets/images/xxx.png)

在css文件使用@assets/images/xxx.png的语法引用相对@assets的目录会报错。说明webpack没有正确识别资源的相对路径。

这是因为css文件是被css-loader所处理,url()中的路径会被css-loader视为绝对路径。因为并没有在css-loader中配置alias属性,所以会找不到@assets

解决方法有两种:

  • css-loader中配置alias,但是相同的别名却要配置两份,会显得冗余。
  • 在引用路径之前添加~符号。background-image: url(~@assets/images/xxx.png);webpack会将以~符号作为前缀的路径视作依赖模块去解析,这样alias配置就生效了。

同样的方法也可以用于非JS文件中。

自动加载模块

有些库会在项目里频繁用到,比如说lodash。而每次使用都得引用一次import _ from 'lodash'麻烦的很!

有一个方法可以自动加载模块:使用ProvidePlugin

new webpack.ProvidePlugin({
_: 'lodash',
// ...
}) // 或者只使用单个方法
new webpack.ProvidePlugin({
_map: ['lodash', 'map']
// ...
})

任何时候,当_被当作未赋值的变量时,lodash就会自动被加载,并且_会被这个 lodash输出的内容所赋值。

指定vue的时候要注意, 对于ES2015模块的default export,必须指定模块的default属性。

new webpack.ProvidePlugin({
Vue: ['vue/dist/vue.esm.js', 'default']
})

公共组件、公共方法与公共指令的注入

在项目的开发中,一般都把重复使用的组件、方法抽象出来放到例如叫common的文件夹中。例如

/common
/components
index.js
/utils
index.js
/directives
index.js
index.js

在前面这三个index.js文件中,一般是export出各个类型的函数,例如:

// components/index,js
export { component1 } from './component1.vue'
export { component2 } from './component2.vue' // utils/index.js
export { method1 } from './method1.js'
export { method2 } from './method2.js' // directives/index.js
export { directive1 } from './directive1.js'
export { directive2 } from './directive2.js'

然后统一在第四个index.js中,暴露一个install方法,在install里注入到全局

import * as Directives from './directives';
import * as Components from './components';
import * as Utils from './utils'; export default {
install: (Vue) => {
for (let name of Object.keys(Components)) {
Vue.component(Components[name]['name'], Components[name]);
}
for (let name in Directives) {
Vue.directive(name, Directives[name]);
}
Object.assign(Vue.prototype.$utils ? Vue.prototype.$utils : {}, Utils);
}
};

只需在main.js文件中,使用vue.use方法

// main.js
import common from './common';
Vue.use(common);

干净利落!

Gzip加速

最后介绍一个插件:CompressionWebpackPlugin。它可以提供gzip压缩, 优化http请求, 提高加载速度。

// vue.config.js
const CompressionPlugin = require("compression-webpack-plugin");
configureWebpack:config => {
if (process.env.NODE_ENV === 'production') {
// 开启gzip压缩
config.plugins.push(new CompressionPlugin({
algorithm: 'gzip',
test: /\.js$|\.css$/,
threshold: 10240, // 对超过10k的数据进行压缩
cache: true, // 是否需要缓存
deleteOriginalAssets:false // 不删除源文件
}))
}
}

作者: zhangwinwin
链接:vue开发中的"骚操作"
来源:github

vue开发中的"骚操作"的更多相关文章

  1. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  2. Vue开发中的中央事件总线

    在Vue开发中会遇到大量的组件之间共享数据的情形,针对不同的情形,Vue有相对应的解决方案.比如,父组件向子组件传值可以使用props,复杂项目中不同模块之间传值可以使用Vuex.但是,对于一些简单的 ...

  3. vue开发中v-for在Eslint的规则检查下出现:Elements in iteration expect to have 'v-bind:key' directives

    在使用VScode编辑器vue开发过程中,v-for在Eslint的规则检查下出现报错:Elements in iteration expect to have 'v-bind:key' direct ...

  4. (转)webpack从零开始第6课:在Vue开发中使用webpack

    vue官方已经写好一个vue-webpack模板vue_cli,原本自己写一个,发现官方写得已经够好了,自己写显得有点多余,但为了让大家熟悉webpack,决定还是一步一步从0开始写,但源文件就直接拷 ...

  5. 前端vue开发中的跨域问题解决,以及nginx上线部署。(vue devServer与nginx)

    前言 最近做的一个项目中使用了vue+springboot的前后端分离模式 在前端开发的的时候,使用vue cli3的devServer来解决跨域问题 上线部署则是用的nginx反向代理至后台服务所开 ...

  6. vue开发中利用正则限制input框的输入(手机号、非0开头的正整数等)

    我们在前端开发中经常会碰到类似手机号输入获取验证码的情况,通常情况下手机号的输入需要只能输入11位的整数数字.并且需要过滤掉一些明显不符合手机号格式的输入,那么我们就需要用户在输入的时候就控制可以输入 ...

  7. vue开发中的一些简单骚操作

    在开发过程中,我们可以定义很多参数,这时需要通过不同的操作来改变不同的参数,这就比较复杂了, 虽然不难,但是代码多了也不好看,这时我们就可以通过简单的操作就行简化: 1.对象使用方括号 let obj ...

  8. vue 开发中的常见问题

    (一)eslint静态检查 在大家用vue-cli创建工程的时候,会有一项,使用使用eslint,如果选择了y,那么工程就会安装并启用eslint. 这里列举一下常见的错误: 1.多余的分号 2.定义 ...

  9. Vue开发中的移动端适配(px转换成vw)

    1.项目根目录下,创建 .postcssrc.js 文件. 2.安装插件. -D (开发依赖) postcss-import postcss-url cssnano-preset-advanced - ...

随机推荐

  1. java中给多个微信好友自动发信息

    package weixin; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatrans ...

  2. 如果不空null并且不是空字符串才去修改这个值,但这样写只能针对字符串(String)类型,如果是Integer类型的话就会有问题了。 int i = 0; i!=''。 mybatis中会返回tr

    mybatis 参数为Integer型数据并赋值0时,有这样一个问题: mybatis.xml中有if判断条件判断参数不为空时,赋值为0的Integer参数被mybatis判断为空,因此不执行< ...

  3. MongoDB插入数据,除去Class key

    本文来源于: 来源:CSDN 原文:https://blog.csdn.net/ClementAD/article/details/50849680 去除class字段的本质为设置 DefaultMo ...

  4. C++模板元编程----堆排序

    目录 目录 前言 实现的一些小细节 Debug 惰性求值 总结 Ref 前言 经过前两次经验的积累,终于来到了麻烦的堆排序.在一开始接触模板元编程的时候,我就期望有一天能够写出元编程堆排序的代码.原因 ...

  5. nrm : 无法加载文件 C:\Users......因为在此系统上禁止运行脚本。

    1.以管理员身份运行powershell 2.使用set-ExecutionPolicy RemoteSigned命令将计算机上的执行策略更改为 RemoteSigned,输入Y确定 3.查看计算机执 ...

  6. maxmemory-policy

    maxmemory-policy 配置的策略 noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息.(默认值) allkeys-lru: 所有key通用; ...

  7. Ubuntu18.04换源

    引用:https://blog.csdn.net/u012308586/article/details/102953882 第一步.sudo  cp   /etc/apt/sources.list  ...

  8. Head First 设计模式 —— 02. 观察者 (Observer) 模式

    思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...

  9. Redis缓存篇(三)缓存污染

    上一讲介绍了缓存满了,通过内存淘汰机制来淘汰掉数据.如果有的数据一直滞留在缓存中,但又没有应用使用,时间长了,就可能会占据大部分的缓存空间. 今天我们来学习一下缓存污染,以及如何解决缓存污染. 缓存污 ...

  10. 如何保持json序列化的顺序性?

    说到json,相信没有人会陌生,我们天天都在用.那么,我们来讨论个问题,json有序吗?是谁来决定的呢?如何保持? 说到底,json是框架还是啥?实际上它只是一个数据格式,一个规范标准,它永远不会限制 ...