webpack 使用別名(resolve.alias)解決scss @import相對路徑導致的問題


webpack.conf.js 中 resolve.alias 配置

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

配置了resolve.alias 后,在js中我們可以這樣用

// 原本這樣寫
import hongAlert from './../src/scss/icon.scss'

// 現在可以這樣寫
import hongAlert from '@scss/icon.scss'

在scss中需要這樣寫,注意是~@

// 原本這樣寫
@import './../../../scss/mixin.scss';

// 現在可以這樣寫,注意是~@
@import '~@scss/icon.scss';

 

問題與背景

在 *.vue 中的 style 標簽中,我使用 @import 引入 icon.scss 樣式。由於icon需要依賴一個font/woff/ttf。而 icon.scss 和 font 文件夾是同一目錄的。

而Alert.vue卻和它們不同目錄。那這時候編譯會發生什么呢?報錯~

 原因和流程可能是這樣的:vue將icon.scss引入后,再想引入font的時候,卻發現在vue的目錄中找不到font這個文件夾,所以報錯了。

 解決方法,是結合webpack的resolve.alias來配置絕對路徑。

 


 

補充和注意點

1、如果你在js中引用scss,就不會導致這種錯誤。但在js中導入css總覺得怪怪的。

import '@scss/icon.scss'

 2、圖片路徑也可以使用此方法

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

3、如果你使用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')
    }
 },

 4、template中的資源文件也可以這樣做

<img src="~@assets/BusinessInfo_2.png" class="img1">

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM