Webpack 2 生成空 CSS 文件
Webpack 2 generates empty CSS file
阅读 (以及在线研究)后,我仍然无法使用 Webpack 2 (v2.1) 生成 CSS 文件(其中包含 CSS)。 1.0-beta.27)、ExtractText 插件 (v2.0.0-beta.4)、sass-loader (v3.2.0)、css-loader (v0.26.1) 和 style-loader ( v0.13.1).
目前 Webpack 2 成功完成并按预期生成了我的 JS 文件,但是我的 app.css
文件是空的(Chrome 为文件抛出 404)但是生成在正确的位置根据Chrome 中的我的源面板。这让我相信 css-loader
或其他加载程序存在问题。
我当前的 webpack.config.js
文件如下所示:
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const autoprefixer = require('autoprefixer');
const path = require('path');
const resolve = path.resolve;
const rootDir = resolve(__dirname);
const dist = resolve(rootDir, 'coolAppName/secured_assets');
const assetIndex = resolve(rootDir, 'src/app');
const vendorIndex = resolve(rootDir, 'webpack.vendor.js');
const styleIndex = resolve(rootDir, 'webpack.style.js');
const fontPath = '../static/fonts/';
module.exports = {
watchOptions: {
poll: 3000,
aggregateTimeout: 1000,
},
devServer: {
port: 8080,
publicPath: 'http://localhost:8080/secured_assets/',
},
devtool: 'eval-source-map',
entry: {
app: assetIndex,
style: styleIndex,
vendor: vendorIndex,
},
output: {
path: dist,
filename: '[name].js',
publicPath: 'http://localhost:8080/secured_assets/'
},
module: {
loaders: [
// CSS files
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [
{
loader: 'css-loader',
}
]
}),
},
// SCSS files
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [
{
loader: 'css-loader'
},
{
loader: 'sass-loader'
}
]
})
},
{
test: /\.(gif|png)$/,
loaders: [
{
loader: 'url-loader',
query: {
mimetype: 'image/png'
},
},
],
},
{
test: /\.js/,
loaders: 'babel-loader',
include: [
assetIndex,
],
exclude: /(node_modules|bower_components)/,
query: {
cacheDirectory: true,
},
},
{
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loaders: 'url-loader',
query: {
limit: 10000,
mimetype: 'application/font-woff',
name: `${fontPath}[name].[ext]`,
},
},
{
test: /\.(ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loaders: 'file-loader',
query: {
name: `${fontPath}[name].[ext]`,
},
},
{
test: /\.json$/,
loaders: 'json-loader',
},
{
test: /\.html$/,
loaders: 'html-loader',
},
],
},
plugins: [
new ExtractTextPlugin({
filename: '/css/app.css',
allChunks: true,
})
],
};
我的 webpack.style.js
文件如下所示:
// STYLE entrypoint
// vendor (CSS)
require('./coolAppName/static/fonts/custom-font-icons/styles.css');
require('font-awesome/css/font-awesome.css');
require('simple-line-icons/css/simple-line-icons.css');
require('lato-font');
require('./node_modules/bootswatch/yeti/bootstrap.min.css');
require('./node_modules/angularjs-toaster/toaster.css');
require('./node_modules/angular-busy2/dist/angular-busy.css');
require('./node_modules/perfect-scrollbar/dist/css/perfect-scrollbar.css');
require('./node_modules/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.css');
require('./node_modules/angularjs-slider/dist/rzslider.min.css');
require('./node_modules/ui-select/dist/select.css');
require('./coolAppName/static/fonts/noto/noto.css');
// SCSS
require('./src/app/css/templates.scss');
我的文件结构看起来像这样(正确):
在尝试迁移到 Webpack 2 之前,一切都按预期进行。唯一改变的是与 Webpack 2 升级有关,所有文件路径和我使用的加载器都是相同的(除了升级版本)。
这就是 重要 部分在 Webpack 1 中的样子(对于上面的这个例子,我去掉了 postcss-loader)
{
test: /\.css$/,
loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap!postcss-loader'),
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap!sass-loader?sourceMap!postcss-loader'),
},
最终我想在 /secured_assets/css/app.css
中创建 1 个 CSS 文件,其中包含我 require
在 webpack.style.js
中的所有样式。此时,我没有收到任何错误,app.css
没有内容,我在网络面板中看到 404(尽管它显示在 Chrome 的源代码中)。
更新
当我简单地 运行 webpack --config ./webpack.dev.js
时,它会正确创建我的 app.css
。当我 运行 webpack-dev-server --config ./webpack.dev.js
它没有。所以看起来可能是 webpack-dev-server 问题...
您应该使用查询参数 importLoaders
(文档:importing and chained loaders):
// SCSS files
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [
{
loader: 'css-loader',
query: {
importLoaders: 1
}
},
{
loader: 'sass-loader'
}
]
})
}
问题出在我的 plugins
数组中 ExtractTextPlugin 的 filename
前面的斜杠 (/
)。
之前:
new ExtractTextPlugin({
filename: '/css/app.css',
allChunks: true,
})
之后:
new ExtractTextPlugin({
filename: 'css/app.css',
allChunks: true,
})
webpack-dev-server
进行此更改后能够正确找到此文件。
阅读
目前 Webpack 2 成功完成并按预期生成了我的 JS 文件,但是我的 app.css
文件是空的(Chrome 为文件抛出 404)但是生成在正确的位置根据Chrome 中的我的源面板。这让我相信 css-loader
或其他加载程序存在问题。
我当前的 webpack.config.js
文件如下所示:
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const autoprefixer = require('autoprefixer');
const path = require('path');
const resolve = path.resolve;
const rootDir = resolve(__dirname);
const dist = resolve(rootDir, 'coolAppName/secured_assets');
const assetIndex = resolve(rootDir, 'src/app');
const vendorIndex = resolve(rootDir, 'webpack.vendor.js');
const styleIndex = resolve(rootDir, 'webpack.style.js');
const fontPath = '../static/fonts/';
module.exports = {
watchOptions: {
poll: 3000,
aggregateTimeout: 1000,
},
devServer: {
port: 8080,
publicPath: 'http://localhost:8080/secured_assets/',
},
devtool: 'eval-source-map',
entry: {
app: assetIndex,
style: styleIndex,
vendor: vendorIndex,
},
output: {
path: dist,
filename: '[name].js',
publicPath: 'http://localhost:8080/secured_assets/'
},
module: {
loaders: [
// CSS files
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [
{
loader: 'css-loader',
}
]
}),
},
// SCSS files
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [
{
loader: 'css-loader'
},
{
loader: 'sass-loader'
}
]
})
},
{
test: /\.(gif|png)$/,
loaders: [
{
loader: 'url-loader',
query: {
mimetype: 'image/png'
},
},
],
},
{
test: /\.js/,
loaders: 'babel-loader',
include: [
assetIndex,
],
exclude: /(node_modules|bower_components)/,
query: {
cacheDirectory: true,
},
},
{
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loaders: 'url-loader',
query: {
limit: 10000,
mimetype: 'application/font-woff',
name: `${fontPath}[name].[ext]`,
},
},
{
test: /\.(ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loaders: 'file-loader',
query: {
name: `${fontPath}[name].[ext]`,
},
},
{
test: /\.json$/,
loaders: 'json-loader',
},
{
test: /\.html$/,
loaders: 'html-loader',
},
],
},
plugins: [
new ExtractTextPlugin({
filename: '/css/app.css',
allChunks: true,
})
],
};
我的 webpack.style.js
文件如下所示:
// STYLE entrypoint
// vendor (CSS)
require('./coolAppName/static/fonts/custom-font-icons/styles.css');
require('font-awesome/css/font-awesome.css');
require('simple-line-icons/css/simple-line-icons.css');
require('lato-font');
require('./node_modules/bootswatch/yeti/bootstrap.min.css');
require('./node_modules/angularjs-toaster/toaster.css');
require('./node_modules/angular-busy2/dist/angular-busy.css');
require('./node_modules/perfect-scrollbar/dist/css/perfect-scrollbar.css');
require('./node_modules/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.css');
require('./node_modules/angularjs-slider/dist/rzslider.min.css');
require('./node_modules/ui-select/dist/select.css');
require('./coolAppName/static/fonts/noto/noto.css');
// SCSS
require('./src/app/css/templates.scss');
我的文件结构看起来像这样(正确):
在尝试迁移到 Webpack 2 之前,一切都按预期进行。唯一改变的是与 Webpack 2 升级有关,所有文件路径和我使用的加载器都是相同的(除了升级版本)。
这就是 重要 部分在 Webpack 1 中的样子(对于上面的这个例子,我去掉了 postcss-loader)
{
test: /\.css$/,
loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap!postcss-loader'),
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap!sass-loader?sourceMap!postcss-loader'),
},
最终我想在 /secured_assets/css/app.css
中创建 1 个 CSS 文件,其中包含我 require
在 webpack.style.js
中的所有样式。此时,我没有收到任何错误,app.css
没有内容,我在网络面板中看到 404(尽管它显示在 Chrome 的源代码中)。
更新
当我简单地 运行 webpack --config ./webpack.dev.js
时,它会正确创建我的 app.css
。当我 运行 webpack-dev-server --config ./webpack.dev.js
它没有。所以看起来可能是 webpack-dev-server 问题...
您应该使用查询参数 importLoaders
(文档:importing and chained loaders):
// SCSS files
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
fallbackLoader: 'style-loader',
loader: [
{
loader: 'css-loader',
query: {
importLoaders: 1
}
},
{
loader: 'sass-loader'
}
]
})
}
问题出在我的 plugins
数组中 ExtractTextPlugin 的 filename
前面的斜杠 (/
)。
之前:
new ExtractTextPlugin({
filename: '/css/app.css',
allChunks: true,
})
之后:
new ExtractTextPlugin({
filename: 'css/app.css',
allChunks: true,
})
webpack-dev-server
进行此更改后能够正确找到此文件。