vuecli3 引入全局scss变量_vuecli3 从搭建到优化

编者按:本文转载自掘金专栏,由作者 lMadman 授权奇舞周刊转载。

前言

github地址:https://github.com/LeeStaySmall/vue-project-demo (完整分支:optimize分支)

demo地址:http://vue-project-demo.eloco.cn/

安装与初始化

安装

node >= 8.9 推荐:8.11.0 +

安装:npm install -g @vue/cli

检查:vue --version

如果已安装旧版本,需要先npm uninstall vue-cli -g 卸载掉旧版本。

初始化架构

  • 创建:vue create project-name

f1fb842540212721356d0148caa46177.png

注:项目名称不能驼峰命名。

  • 选择一个预设(这里我选择更多功能):

551c812d161e225590a191b50a2df7c9.png

  • 选择需要安装的(Babel、Router、Vuex、Pre-processors、Linter / Formatter):

c3470b8276c2c2af63c3a2f8ea018822.png

  • 是否使用history路由模式(Yes):

cbc189f98fb4b387a1b14cddb45d3553.png

  • 选择css 预处理器(Sass/SCSS):

5f7d03a5a3e6742a4bfbaeec48645fde.png

  • 选择eslint 配置(ESLint + Standard config):

415abe7756c875a240f16d8079fb77e3.png

  • 选择什么时候执行eslint校验(Lint on save):

39782522a5bd4d93dfddc9740574af23.png

  • 选择以什么样的形式配置以上所选的功能(In dedicated config files):

16e56659227306239c41c1c762a7ffdd.png

  • 是否将之前的设置保存为一个预设模板(y):

99ea7d74f09093eb62406c943cb03ddc.png

如果选择 y 会让输入名称,以便下次直接使用,否则直接开始初始化项目。

  • 最后,看一下生成的基本架构目录:

a42de4f766217a45a8b27009f185c84a.png

优化

在项目中优雅的使用svg

  • 首先在/src/components 创建 SvgIcon.vue:

b2d798304f9812b61745c33af25259d8.png

参考:未来必热:SVG Sprite技术介绍 - 张鑫旭(https://www.zhangxinxu.com/wordpress/2014/07/introduce-svg-sprite-technology/)

  • 在src/下创建 icons文件夹,以及在其下创建svg文件夹用于存放svg文件,创建index.js作为入口文件:

1d9c77d84e7fc50c03fae65c3de2f63d.png

编写index.js 的脚本:

import Vue from 'vue'

import SvgIcon from '@/components/SvgIcon.vue' // svg组件

// 全局注册

Vue.component('svg-icon', SvgIcon)

const requireAll = requireContext => requireContext.keys().map(requireContext)

const req = require.context('./svg', false, /\.svg$/)

requireAll(req)

  • 使用svg-sprite-loader对项目中使用的svg进行处理:

npm install svg-sprite-loader --save-dev;

修改默认的webpack配置, 在项目根目录创建vue.config.js,代码如下;

const path = require('path')

function resolve(dir) {

  return path.join(__dirname, './', dir)

}

module.exports = {

  chainWebpack: config => {

    // svg loader

    const svgRule = config.module.rule('svg') // 找到svg-loader

    svgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后

    svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录

    svgRule // 添加svg新的loader处理

      .test(/\.svg$/)

      .use('svg-sprite-loader')

      .loader('svg-sprite-loader')

      .options({

        symbolId: 'icon-[name]'

      })

    // 修改images loader 添加svg处理

    const imagesRule = config.module.rule('images')

    imagesRule.exclude.add(resolve('src/icons'))

    config.module

      .rule('images')

      .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)

  }

}

  • 最后,在main.js 中引入import '@/icons'即可;

// 使用示例

<svg-icon icon-class="add" />

PS:至于svg ,个人比较建议使用阿里开源的图标库 iconFont

axios封装api、模块化vuex

axios篇
  • 项目中安装axios: npm install axios;

  • 在src目录下创建utils/, 并创建request.js用来封装axios,上代码:

import axios from 'axios'

// 创建axios 实例

const service = axios.create({

  baseURL: process.env.BASE_API, // api的base_url

  timeout: 10000 // 请求超时时间

})

// request 拦截器

service.interceptors.request.use(

  config => {

    // 这里可以自定义一些config 配置

    return config

  },

  error => {

    // 这里处理一些请求出错的情况

    console.log(error)

    Promise.reject(error)

  }

)

// response 拦截器

service.interceptors.response.use(

  response => {

    const res = response.data

    // 这里处理一些response 正常放回时的逻辑

    return res

  },

  error => {

    // 这里处理一些response 出错时的逻辑

    return Promise.reject(error)

  }

)

export default service

  • 既然要使用axios ,必不可少的需要配置环境变量以及需要请求的地址,这里可以简单的修改poackage.json:

"scripts": {

    "dev": "vue-cli-service serve --project-mode dev",

    "test": "vue-cli-service serve --project-mode test",

    "pro": "vue-cli-service serve --project-mode pro",

    "pre": "vue-cli-service serve --project-mode pre",

    "build:dev": "vue-cli-service build --project-mode dev",

    "build:test": "vue-cli-service build --project-mode test",

    "build:pro": "vue-cli-service build --project-mode pro",

    "build:pre": "vue-cli-service build --project-mode pre",

    "build": "vue-cli-service build",

    "lint": "vue-cli-service lint"

  },

同时修改vue.config.js:

const path = require('path')

function resolve(dir) {

  return path.join(__dirname, './', dir)

}

module.exports = {

  chainWebpack: config => {

    // 这里是对环境的配置,不同环境对应不同的BASE_API,以便axios的请求地址不同

    config.plugin('define').tap(args => {

      const argv = process.argv

      const mode = argv[argv.indexOf('--project-mode') + 1]

      args[0]['process.env'].MODE = `"${ mode}"`

      args[0]['process.env'].BASE_API = '"http://47.94.138.75:8000"'

      return args

    })

    // svg loader

    const svgRule = config.module.rule('svg') // 找到svg-loader

    svgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后

    svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录

    svgRule // 添加svg新的loader处理

      .test(/\.svg$/)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值