我正在使用具有此目录结构的React和Webpack构建Web应用程序
/src /components /containers App.js App.scss /assets /fonts MarkOT/ MarkOT.css MarkOT.eot ... ... /images /styles _vars.scss
我正试图_vars.scss
从App.scss
这样导入:
@import '../../styles/vars';
这工作得很好.什么是行不通的,如果我有进口_vars.scss
@import "../assets/fonts/MarkOT-ExtraLight/MarkOT-ExtraLight.css"; @import "../assets/fonts/MarkOT-Light/MarkOT-Light.css"; @import "../assets/fonts/MarkOT/MarkOT.css"; @import "../assets/fonts/MarkOT-Medium/MarkOT-Medium.css"; @import "../assets/fonts/MarkOT-Book/MarkOT-Book.css";
那些导入应该相对于styles
文件夹解析.而是相对于进口得到解决containers/App/App.scss
.我在sass-loader
网站上看到,应该使用它resolve-url-loader
来解决这个问题,但我无法让它工作.
对like的导入@import "~../assets/fonts/MarkOT-ExtraLight/MarkOT-ExtraLight.css";
只包含一个@font-face
声明:
@font-face { font-family: 'MarkOT'; src: url('MarkOT.eot?#iefix') format('embedded-opentype'), url('MarkOT.otf') format('opentype'), url('MarkOT.woff') format('woff'), url('MarkOT.ttf') format('truetype'), url('MarkOT.svg#MarkOT') format('svg'); font-weight: normal; font-style: normal; }
这是我的webpack配置:
var webpack = require('webpack'); var path = require('path'); var ExtractTextPlugin = require('extract-text-webpack-plugin'); module.exports = { devtool: 'source-map', context: path.resolve(__dirname, '..'), entry: { app: path.resolve(__dirname, '../src/client/index.js'), vendors: ['react', 'react-dom', 'react-router'] }, output: { path: path.resolve(__dirname, '../dist'), pathInfo: true, filename: 'bundle.js', css: 'main.css' }, module: { preLoaders: [ { test: /\.js?$/, loader: "eslint-loader", exclude: /node_modules/ } ], loaders: [ { test: /src\/.+.js$/, exclude: /node_modules/, loader: 'babel', query: { presets: ['react', 'es2015', 'stage-0'] } }, { test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$/, loader: "file-loader" }, { test: /\.scss?$/, loader: ExtractTextPlugin.extract('style', '!css?sourceMap!resolve-url!sass?output + encodeURIComponent(require('node-bourbon').includePaths) + '&includePaths[]=' + encodeURIComponent(require('node-neat').includePaths[1])) } ] }, resolve: { modulesDirectories: [ 'src', 'node_modules' ] }, plugins: [ new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js'), new ExtractTextPlugin('main.css') ] };
这一行尤其适合处理我的风格:
{ test: /\.scss?$/, loader: ExtractTextPlugin.extract('style', '!css?sourceMap!resolve-url!sass?output + encodeURIComponent(require('node-bourbon').includePaths) + '&includePaths[]=' + encodeURIComponent(require('node-neat').includePaths[1])) }
正如它在resolve-url-loader
网站上所说的那样,我在源代码sass
和css
加载器中都包含了源代码(以及包含波旁威士忌和整齐库的路径,所有这些都加载得很好).
有什么明显的东西我想念我看不到吗?
编辑:
我能够通过创建一个要解决这个问题_font.scss
在同一个目录文件_var.scss
,所有的移动@font-face
声明到_font.scss
,然后替换的所有实例url
与require
字体声明里.
我不喜欢我无法弄清楚为什么另一个人正在工作,但它的工作原理很好.我发现有趣的是,这url
不起作用,我的印象就是css-loader
照顾它.
在你的webpack.config中
resolve: { modulesDirectories: [ 'src', 'node_modules' ], alias: { styles: /*put the base folder of your styles here*/ } }
然后在样式表导入中使用@styles然后使用相对路径
@import '~styles/yourStyle.scss';