SASS 未在 React / Webpack 项目中呈现
Posted
技术标签:
【中文标题】SASS 未在 React / Webpack 项目中呈现【英文标题】:SASS not rendering in React / Webpack project 【发布时间】:2017-04-25 12:35:08 【问题描述】:我将 SASS 添加到我的项目中是因为我喜欢将 SASS 用于我的 CSS。在我的 app 文件夹中,我创建了 CSS 文件夹和一个 SCSS 文件夹。我运行 sass --watch scss:css 将我的 scss 更改映射到 css 文件夹。我认为这很好用。在我的 webpack 中,我添加了一个加载器来处理 SCSS 和 SASS,并将所需的文件添加到我的 package.json 中。为了开始使用 SASS 样式,我需要将它们包含在我的 index.html 文件中,还是需要将它们导入到我想将它们与新的 es6 import x from 'xpath' 东西一起使用的每个组件中?
这是我的 package.json 和 webpack.config.js 文件
"name": "newaccount",
"version": "1.0.0",
"description": "a form submission for new accounts",
"main": "App.js",
"scripts":
"start": "webpack-dev-server"
,
"author": "---",
"license": "ISC",
"dependencies":
"react": "^15.4.1",
"react-dom": "^15.4.1",
"react-hot-loader": "^1.3.1",
"react-router": "^3.0.0"
,
"devDependencies":
"babel-core": "^6.18.2",
"babel-loader": "^6.2.8",
"babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0",
"css-loader": "^0.26.1",
"html-webpack-plugin": "^2.24.1",
"node-sass": "^3.13.0",
"sass": "^0.5.0",
"sass-loader": "^4.0.2",
"style-loader": "^0.13.1",
"webpack": "^1.13.3",
"webpack-dev-server": "^1.16.2"
webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');
var path = require('path');
var HTMLWebpackPluginConfig = new HtmlWebpackPlugin(
template: __dirname + '/app/index.html',
filename: 'index.html',
inject: 'body'
);
module.exports =
entry: [
'./app/App.js'
],
output:
path: __dirname + '/public',
filename: "index_bundle.js"
,
plugins: [HTMLWebpackPluginConfig],
devServer:
inline:true,
contentBase: './public',
port: 3333
,
module:
loaders: [
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
,
test: /\.scss$/,
include: path.join(__dirname, "app"),
loaders: ["style", "css", "sass"]
,
test: /\.scss$/,
loader: 'style!css!sass'
]
;
我的文件结构基本上是一个app文件夹和一个public文件夹。在应用程序内部,您有组件/容器/css/scss/utils,而在公共内部则是 bundle.js 和 index.html 文件。
【问题讨论】:
【参考方案1】:你不应该在 Webpack 中使用外部 Sass 命令。您需要将 Sass 内容放入 Webpack 的依赖关系图中。为此,请告诉 Webpack 您正在使用这些文件,这是通过 require()
完成的。在需要样式的页面的 javascript 文件顶部,添加
require('./path/to/sass/scss')
在开发模式下,这会将您的 Sass 代码转换为 Javascript,从而将内置的 CSS 规则注入页面。我知道这很奇怪,但它可以让你热重新加载样式。您还应该有一个单独的生产构建 Webpack 配置,使用 ExtractTextPlugin 将构建的 CSS 提取到一个单独的文件中,并将该文件加载到您的生产 HTML 中。
延伸阅读:Webpack: When to Use and Why.
【讨论】:
所以不需要整个scss应用映射到css?我只是编写 sass 文件,并在我想使用的 react 组件 .js 文件的顶部包含 sass 文件?就像 import sassBase from '../app/scss/base/_base.scss' 或者只是 require('../app/scss/base/_base.scss') 你制作的相当不错的 Webpack 指南,也不知道捆绑图片。 正确。 Webpack 应该知道您的应用程序需要运行的所有静态资产。它为您提供安全性并保证您的应用程序需要的所有文件都将加载。与在不存在的 Javascript 文件上调用require()
的方式相同,会出错并导致构建失败,现在您可以获得图像、css、字体等相同的好处。
如果我尝试从我的组件访问 scss 文件目录,在 ./~/css-loader!./~/sass-loader!./~/ style-loader!./~/css-loader!./~/sass-loader!./app/scss/base/_base.scss 模块构建失败:^“...加载样式”后 CSS 无效:预期 1选择器或规则,在 /Users/sam/Desktop/project/newAccount/app/scss/base/_base.scss(第 1 行,第 1 列)@ ./app/scss/base/ 中为“var content = requi” _base.scss 4:14-263
您需要的 sass 文件是否包含代码 var content=...
?这不是有效的 sass【参考方案2】:
我的 webpack.config.js 文件加载 scss 和 sass 两次,将其更改为
test: /\.scss$/,
loader: 'style!css!sass'
]
通过删除
test: /\.scss$/,
include: path.join(__dirname, "app"),
loaders: ["style", "css", "sass"]
,
现在我可以将我的 SASS 文件包含在我的 react 组件中。现在我需要弄清楚如何访问我的 SASS 文件中的图像 - 似乎会抛出大量错误 =(
【讨论】:
图像的加载方式应与需要任何文件的方式相同,具有本地路径,但使用 url 而不是 require。background-image: url(./local/path.jpg)
以上是关于SASS 未在 React / Webpack 项目中呈现的主要内容,如果未能解决你的问题,请参考以下文章
sass-loader 不适用于 webpack + react + grommet
Node SASS 的 React JS Webpack 失败
带有 Webpack、React 和 Babel 的 Sass-loader 无法正常工作
使用 Webpack、SASS 和 React 在“main.scss”上出现错误“找不到模块”
React-boilerplate+grommet,让 sass 和 webpack 一起工作
未捕获的类型错误:WEBPACK_IMPORTED_MODULE_1__.default 未定义(React、SASS、SCSS)