webpack 使用别名(resolve.alias)解决scss @import相对路径致使的问题

webpack.conf.js 中 resolve.alias 配置css

resolve: {
         extensions: ['.js', '.vue'],
         alias: {
             '@': path.resolve(__dirname, 'src'),
             '@scss': path.resolve(__dirname, 'src', 'scss'),
         }
}

配置了resolve.alias 后,在js中咱们能够这样用vue

// 本来这样写
import hongAlert from './../src/scss/icon.scss'

// 如今能够这样写
import hongAlert from '@scss/icon.scss'

在scss中须要这样写,注意是~@webpack

// 本来这样写
@import './../../../scss/mixin.scss';

// 如今能够这样写,注意是~@
@import '~@scss/icon.scss';

 

问题与背景web

在 *.vue 中的 style 标签中,我使用 @import 引入 icon.scss 样式。因为icon须要依赖一个font/woff/ttf。而 icon.scss 和 font 文件夹是同一目录的。vue-cli

而Alert.vue却和它们不一样目录。那这时候编译会发生什么呢?报错~json

 缘由和流程多是这样的:vue将icon.scss引入后,再想引入font的时候,却发如今vue的目录中找不到font这个文件夹,因此报错了。sass

 解决方法,是结合webpack的resolve.alias来配置绝对路径。ide

 


 

补充和注意点ui

一、若是你在js中引用scss,就不会致使这种错误。但在js中导入css总以为怪怪的。url

import '@scss/icon.scss'

 二、图片路径也可使用此方法

 .hideicon {
       background-image: url("~@assets/arrow.png");
 }

三、若是你使用vue-cli搭建的脚手架,要注意相对路劲的问题(weboack.config.js是放在build文件夹中的,因此须要先往上一级)

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

 resolve: {
    extensions: ['.js', '.vue', '.json', '.scss'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      '@components': resolve('src/components'),
      '@myComponents': resolve('src/myComponents'),
      '@sass': resolve('src/sass'),
      '@assets': resolve('src/assets')
    }
 },

 四、template中的资源文件也能够这样作

<img src="~@assets/BusinessInfo_2.png" class="img1">
相关文章
相关标签/搜索