blog: 删除过时文章

This commit is contained in:
xugaoyi 2021-08-01 14:11:36 +08:00
parent 990c1fea1d
commit 31bd1dc060
5 changed files with 1 additions and 562 deletions

View File

@ -10,7 +10,7 @@ module.exports = [
text: '前端文章',
items: [
{ text: 'JavaScript', link: '/pages/8143cc480faf9a11/' },
{ text: 'Vue', link: '/pages/5d463fbdb172d43b/' },
// { text: 'Vue', link: '/pages/5d463fbdb172d43b/' },
],
},
{

View File

@ -1,129 +0,0 @@
---
title: Vue CLi3 修改webpack配置
date: 2020-02-22 15:00:36
permalink: /pages/5d463fbdb172d43b
categories:
- 前端
- Vue文章
tags:
- null
author:
name: xugaoyi
link: https://github.com/xugaoyi
---
# Vue CLi3 修改webpack配置
## 审查项目的 webpack 配置
因为 `@vue/cli-service` 对 webpack 配置进行了抽象当你想查看webpack的配置时可以使用 `inspect`命令:
<!-- more -->
```sh
vue inspect # 在终端打印 webpack配置信息
```
```sh
vue inspect > output.js # 把webpack配置信息生成到output.js文件
```
注意,`output.js` 文件不是一个有效的 webpack 配置文件,仅用于审查。
## 修改webpack配置
以**修改路径别名**为例:
1. 项目根目录创建文件 `vue.config.js`
2. 参考如下代码修改路径别名:
```js
// vue.config.js
const path = require('path')
const resolve = dir => path.resolve(__dirname, dir)
module.exports = {
chainWebpack: config => {
config.resolve.alias
.set('styles', resolve('src/assets/styles'))
}
}
```
## 参考
* [官方文档](https://cli.vuejs.org/zh/guide/webpack.html)
* [官方 vue.config.js 参数说明](https://cli.vuejs.org/zh/config/#vue-config-js)
* [vue.config.js 设置接口代理示例](https://github.com/ustbhuangyi/vue-music/blob/master/vue.config.js)
* 配置示例:
```js
const path = require('path')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const ProxyAgent = require('proxy-agent')
const resolve = dir => path.resolve(__dirname, dir)
module.exports = {
outputDir: process.env.outputDir || 'dist', // 'dist', 生产环境构建文件的目录
runtimeCompiler: true,
assetsDir: 'static',
productionSourceMap: false, // 生产环境的 source map
parallel: require('os').cpus().length > 1,
configureWebpack: config => {
// 公共配置
// cdn引用时配置externals 防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖
config.externals = {
'vue': 'Vue',
'vue-router': 'VueRouter',
'element-ui': 'ELEMENT',
'vuex': 'Vuex',
'axios': 'axios'
}
config.resolve.alias = Object.assign({}, config.resolve.alias, {
'src': resolve('src/common'),
'common': resolve('src/views/common'),
'static': resolve('static')
})
if (process.env.NODE_ENV === 'production') {
// 为生产环境修改配置...
config.optimization = {
minimizer: [
new UglifyJsPlugin({
uglifyOptions: {
compress: {
drop_console: true, // console
drop_debugger: false,
pure_funcs: ['console.log']// 移除console
}
}
})
]
}
} else {
// 为开发环境修改配置...
}
},
css: {
loaderOptions: {
css: {
importLoaders: 1 // @import 引入的文件可被一个loader处理 2 可被两个loader处理
}
}
},
devServer: {
port: 80,
disableHostCheck: true, // 可使用本地host配置的域名访问
proxy: {
'/api': {
agent: new ProxyAgent('http://132.128.11.12'),
target: 'http://132.128.11.12',
ws: false,
changeOrigin: true
}
}
}
}
```

View File

@ -1,94 +0,0 @@
---
title: Vue中的scoped和scoped穿透
date: 2020-02-23 10:54:23
permalink: /pages/c80d2751cf1f4268
categories:
- 前端
- Vue文章
tags:
- null
author:
name: xugaoyi
link: https://github.com/xugaoyi
---
# Vue中的scoped和scoped穿透
## 什么是scoped
在Vue文件中的style标签上有一个特殊的属性`scoped`。当一个style标签拥有`scoped`属性时候它的css样式只能用于当前的Vue组件可以使组件的样式不相互污染。如果一个项目的所有style标签都加上了`scoped`属性,相当于实现了样式的模块化。
<!-- more -->
```html
<style lang="less" scoped>
```
## scoped的实现原理
Vue中的`scoped`属性的效果主要是通过`PostCss`实现的。以下是转译前后的代码:
转译前:
```html
<style lang="less" scoped>
.example{
color:red;
}
</style>
<template>
<div class="example">scoped测试案例</div>
</template>
```
转译后:
```html
<style>
.example[data-v-5558831a] {
color: red;
}
</style>
<template>
<div class="example" data-v-5558831a>scoped测试案例</div>
</template>
```
`PostCSS`给一个组件中的所有DOM添加了一个独一无二的动态属性给css选择器额外添加一个对应的属性选择器来选择组件中的DOM,这种做法使得样式只作用于含有该属性的DOM元素(组件内部的DOM)。
**总结:`scoped`的渲染规则**
1. 给HTML的DOM节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个DOM 元素
2. 在每句css选择器的末尾(编译后生成的css语句)加一个当前组件的data属性选择器(例如:[data-v-5558831a])来私有化样式
## scoped穿透
`scoped`看起来很好用当时在Vue项目中当我们引入第三方组件库时(如使用vue-awesome-swiper实现移动端轮播),需要在局部组件中修改第三方组件库的样式,而又不想去除`scoped`属性造成组件之间的样式覆盖。这时我们可以通过特殊的方式穿透scoped。
**stylus的样式穿透 使用 `>>>`**
```stylus
外层 >>> 子组件元素
样式
.wrapper >>> .swiper-pagination-bullet-active
background: #fff
```
**sass和less的样式穿透 使用`/deep/`**
```less
外层 /deep/ 子组件元素 {
样式
}
.wrapper /deep/ .swiper-pagination-bullet-active{
background: #fff;
}
```
## 在组件中修改第三方组件库样式的其它方法
上面我们介绍了在使用`scoped` 属性时,通过`scoped`穿透的方式修改引入第三方组件库样式的方法,下面我们介绍其它方式来修改引入第三方组件库的样式:
* 在vue组件中不使用`scoped`属性
* 在vue组建中使用两个style标签一个加上`scoped`属性,一个不加`scoped`属性把需要覆盖的css样式写在不加`scoped`属性的style标签里
* 建立一个reset.css(基础全局样式)文件里面写覆盖的css样式在入口文件main.js 中引入

View File

@ -1,223 +0,0 @@
---
title: Vue项目使用mock数据的几种方式
date: 2020-02-26 14:06:58
permalink: /pages/bd1af2f75fd361fc
categories:
- 前端
- Vue文章
tags:
- null
author:
name: xugaoyi
link: https://github.com/xugaoyi
---
# Vue项目使用mock数据的几种方式
本文是基于vue/cli 3.0创建的项目进行讲解
首先我们来说一说vue/cli 3.0 与 2.0 的一些不同:
1. 3.0 移除了 static 文件目录,新增了 public 目录,这个目录下的静态资源不会经过 webpack 的处理会被直接拷贝所以我们能够直接访问到该目录下的资源静态数据如json数据、图片等需要存放在这里。
<!-- more -->
> 放在`public`目录下的静态资源可直接通过(http://localhost:8080/+ 文件名称)来访问,不需要在前面加一个`/public`路径
2. 3.0 移除了 config、build 等配置目录,如果需要进行相关配置我们需要在根目录下创建` vue.config.js` 进行配置。
## 方式一使用mockjs插件实现本地mock数据
1. 安装`mockjs`插件
```sh
npm i mockjs -D
```
2. 在src目录下创建一个`mock`文件夹,在`mock`文件夹下创建一个`index.js`和一个`data`文件夹(用于存放项目需要的模拟数据)
```
.
├── src
│ ├── mock
│ │ └── data
│ │ │ └── test.json
│ │ └── index.js
. .
```
3. `mock`目录下的`index.js`示例如下:
```js
const Mock = require('mockjs')
// 格式: Mock.mock( url, 'post'|'get' , 返回的数据)
Mock.mock('/api/test', 'get', require('./data/test.json'))
Mock.mock('/api/test2', 'post', require('./data/test2.json'))
```
4. 在`main.js`入口文件中引入mock数据不需要时则注释掉
```js
require('./mock') // 引入mock数据不需要时则注释掉
```
5. 最后在vue模板中使用即可
```js
axios.get('/api/test')
.then(function(res){
console.log(res);
})
.catch(function(err){
console.log(err);
});
```
## 方式二在public文件夹放mock数据无需使用mockjs插件
1. 在`public`文件夹下创建一个`mock`文件夹用来存放模拟数据的json文件
```
.
├── public
│ ├── mock
│ │ └── test.json
. .
```
> 放在`public`目录下的静态资源可直接通过(http://localhost:8080/ + 文件名称)来访问,不需要在前面加一个`/public`路径。
2. 在`vue.config.js`里进行路径配置,如下:
```js
module.exports = {
devServer: {
proxy: {
'/api': { // 代理接口
target: 'http://localhost:8080',
ws: true, // proxy websockets
changeOrigin: true, // 是否开启跨域
pathRewrite: { // 路径重写
'^/api': '/mock'
}
}
}
}
}
```
[devServer.proxy官方文档](https://cli.vuejs.org/zh/config/#devserver-proxy)
3. 最后在vue模板中使用即可
```js
axios.get('/api/test.json') // 注意这里需要.json后缀
.then(function(res){
console.log(res);
})
.catch(function(err){
console.log(err);
});
```
> 这方式貌似不支持`post`请求,有待研究。
## 方式三前端本地启动一个nodejs服务vue项目向nodejs服务请求mock数据
1. 创建一个node项目为了方便本例直接在vue项目根目录创建当然也可以是其它任何地方
```
.
├── 项目根目录
│ └── serve.js
. .
```
2. `serve.js`示例
```js
const http = require('http')
// url模块用于处理与解析 前端传给后台的URL适用于get请求不适用于post请求详情参见文档
const urlLib = require('url')
http.createServer(function (req, res) {
const urlObj = urlLib.parse(req.url, true) // 注意这里的第二个参数一定要设置为true, query才能解析为对象形式,可以更加方便地获取key:value
const url = urlObj.pathname
const get = urlObj.query
console.log(url)
// 模拟的mock数据
const data = {
"code": 200,
"list": [
{
"id": '0001',
"name": "test"
},
{
"id": '0002',
"name": "test2"
}
]
}
// console.log(get.user)
if (url === '/test') { // 接口名
res.write(JSON.stringify(data))
}
res.end()
}).listen(9000)
```
3. 启动node服务
```sh
node serve.js
```
4. 配置`vue.config.js`的`proxy`,解决跨域
```js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:9000',
ws: true, // proxy websockets
changeOrigin: true, // 是否开启跨域
pathRewrite: { // 路径重写
'^/api': ''
}
}
}
}
}
```
5. 最后在vue模板中使用即可
```js
axios.get('/api/test')
.then(function(res){
console.log(res);
})
.catch(function(err){
console.log(err);
});
```
## 总结
方式二目前来看只支持get方式请求对于post请求还有待研究。方式三虽然也是一种实现方式但实现起来比较麻烦。个人建议使用方式一灵活、方便。
## 相关文章
[《Vue CLi3 修改webpack配置》](https://xugaoyi.com/pages/5d463fbdb172d43b/)

View File

@ -1,115 +0,0 @@
---
title: 混入(Mixins)
date: 2020-02-23 15:47:03
permalink: /pages/9f15c1a281d8bedb
categories:
- 页面
- stylus
tags:
- null
author:
name: xugaoyi
link: https://github.com/xugaoyi
---
# stylus混入(Mixins)
## 混入(Mixins)
混入和函数定义方法一致,但是应用却大相径庭。
一个简单的混入应用,定义一个超出显示省略号的`ellipsis()`方法,在需要用到的地方只需插入这个方法,其样式会扩展并复制到选择器中。
<!-- more -->
```stylus
ellipsis()
overflow hidden
white-space nowrap
text-overflow ellipsis
```
```stylus
p
ellipsis()
```
下面有定义的`border-radius(n)`方法,其却作为一个*mixin*(如,作为状态调用,而非表达式)调用。
当`border-radius()`选择器中调用时候,属性会被扩展并复制在选择器中。
```stylus
border-radius(n)
-webkit-border-radius n
-moz-border-radius n
border-radius n
form input[type=button]
border-radius(5px)
```
编译成:
```css
form input[type=button] {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
```
使用混入书写,你可以完全忽略括号,提供梦幻般私有属性的支持。
```stylus
border-radius(n)
-webkit-border-radius n
-moz-border-radius n
border-radius n
form input[type=button]
border-radius 5px
```
注意到我们混合书写中的`border-radius`当作了属性,而不是一个递归函数调用。
更进一步,我们可以利用`arguments`这个局部变量,传递可以包含多值的表达式。
```stylus
border-radius()
-webkit-border-radius arguments
-moz-border-radius arguments
border-radius arguments
```
现在,我们可以像这样子传值:`border-radius 1px 2px / 3px 4px`!
另外一个很赞的应用是特定的私有前缀支持——例如IE浏览器的透明度
```stylus
support-for-ie ?= true
opacity(n)
opacity n
if support-for-ie
filter unquote('progid:DXImageTransform.Microsoft.Alpha(Opacity=' + round(n * 100) + ')')
#logo
&:hover
opacity 0.5
```
渲染为:
```css
#logo:hover {
opacity: 0.5;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
}
```
来源:<https://www.zhangxinxu.com/jq/stylus/mixins.php>