拆分CSS

目前如果css和js是在一个entry编译的,如果其中任一种内容改变都会重新编译。为了能够FOUC(Flash of Unstyled Content),通过ExtractTextPlugin可以完成样式文件的拆分

设置extract-text-webpack-plugin

安装npm i extract-text-webpack-plugin --save-dev

  1. // libs/parts.js
  2. const webpack = require('webpack');
  3. const CleanWebpackPlugin = require('clean-webpack-plugin');
  4. const ExtractTextPlugin = require('extract-text-webpack-plugin');
  5. ...
  6. exports.extractCSS = function(paths) {
  7. return {
  8. module: {
  9. loaders: [
  10. {
  11. test: /\.css$/,
  12. // 可以通过!链接更多的loader
  13. loader: ExtractTextPlugin.extract('style', 'css'),
  14. include: paths
  15. }
  16. ]
  17. },
  18. plugins: [
  19. // Output extracted CSS to a file
  20. new ExtractTextPlugin('[name].[chunkhash].css')
  21. ]
  22. };
  23. }
  1. // webpack.config.js
  2. ...
  3. switch(process.env.npm_lifecycle_event) {
  4. case 'build':
  5. config = merge(
  6. ...
  7. parts.minify(),
  8. parts.extractCSS(PATHS.app)
  9. // parts.setupCSS(PATHS.app)
  10. );
  11. break;
  12. default:
  13. config = merge(
  14. ...
  15. );
  16. }
  17. module.exports = validate(config);

分开应用代码和样式

  1. // app/index.js文件
  2. require('react');
  3. // require('./main.css');
  4. ...
  1. // webpack.config.js文件
  2. ...
  3. const PATHS = {
  4. app: path.join(__dirname, 'app'),
  5. // 独立样式文件路径
  6. style: path.join(__dirname, 'app', 'main.css'),
  7. build: path.join(__dirname, 'build')
  8. };
  9. const common = {
  10. entry: {
  11. style: PATHS.style,
  12. app: PATHS.app
  13. },
  14. ...
  15. };
  16. switch(process.env.npm_lifecycle_event) {
  17. case 'build':
  18. config = merge(
  19. ...
  20. parts.minify(),
  21. parts.extractCSS(PATHS.style)
  22. //parts.extractCSS(PATHS.app)
  23. );
  24. break;
  25. default:
  26. config = merge(
  27. ...
  28. parts.setupCSS(PATHS.style),
  29. // parts.setupCSS(PATHS.app),
  30. ...
  31. );
  32. }
  33. module.exports = validate(config);

如果自己观察会发现执行命令以后会多处一个style.xxxxxx.js的文件,内容类似于webpackJsonp([1,3],[function(n,c){}]);。这个文件内容并没有实际作用,webpack生成的,HtmlWebpackPlugin也会包含进去,自行找办法解决吧。


<<上一节:清除build >>下一节:清除未使用CSS