webpack 支持 SCSS

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.s[ac]ss$/i,
  7. use: [
  8. 'style-loader',
  9. 'css-loader',
  10. 'sass-loader'
  11. ]
  12. },
  13. ...
  14. ]
  15. }
  16. ...

支持@

xxx.scss

  1. @import '~@/scss-vars.scss'
  2. ...

SCSS 自动 import 全局文件

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.s[ac]ss$/i,
  7. use: [
  8. 'style-loader',
  9. 'css-loader',
  10. {
  11. loader:'sass-loader',
  12. options:{
  13. additionalData:`@import "~@/xxx.scss";`,
  14. sassOptions:{
  15. includePaths:[__dirname]
  16. }
  17. }
  18. }
  19. ]
  20. },
  21. ...
  22. ]
  23. }
  24. ...

SCSS分享变量给JS

scss-exports.scss

  1. :export{
  2. color:$color;
  3. }

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.s[ac]ss$/i,
  7. use: [
  8. 'style-loader',
  9. {
  10. loader:'css-loader',
  11. options:{
  12. modules:{
  13. compileType:'icss' //支持export
  14. }
  15. }
  16. },
  17. ...
  18. ]
  19. },
  20. ...
  21. ]
  22. }
  23. ...

Webpack 支持 LESS 文件

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.less$/i,
  7. use: [
  8. 'style-loader',
  9. {
  10. loader:'css-loader',
  11. options:{
  12. modules:{
  13. compileType:'icss' //支持export
  14. }
  15. }
  16. },
  17. {
  18. loader:'less-loader'
  19. }
  20. ...
  21. ]
  22. },
  23. ...
  24. ]
  25. }
  26. ...

LESS 自动 import 全局文件

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.less$/i,
  7. use: [
  8. 'style-loader',
  9. {
  10. loader:'css-loader'
  11. },
  12. {
  13. loader:'less-loader',
  14. options:{
  15. additionalData:`@import "~@/xxx.less";`
  16. }
  17. }
  18. ...
  19. ]
  20. },
  21. ...
  22. ]
  23. }
  24. ...

LESS分享变量给JS

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.less$/i,
  7. use: [
  8. 'style-loader',
  9. {
  10. loader:'css-loader',
  11. options:{
  12. modules:{
  13. compileType:'icss' //支持export
  14. }
  15. }
  16. },
  17. {
  18. loader:'less-loader',
  19. options:{
  20. additionalData:`@import "~@/xxx.less";`
  21. }
  22. }
  23. ...
  24. ]
  25. },
  26. ...
  27. ]
  28. }
  29. ...

SCSS v.s. LESS

选 scss
更灵活地可以使用stylus

支持 Stylus 文件

webpack.config.js

  1. ...
  2. module: {
  3. rules:[
  4. ...
  5. {
  6. test: /\.styl(us)$/i,
  7. use: [
  8. 'style-loader',
  9. {
  10. loader:'css-loader',
  11. options:{
  12. modules:{
  13. compileType:'icss' //支持export
  14. }
  15. }
  16. },
  17. {
  18. loader:'stylus-loader',
  19. options:{
  20. stylusOptions:{
  21. import:[path.resolve(__dirname,'src/stylus-vars.stylus')]
  22. }
  23. }
  24. }
  25. ...
  26. ]
  27. },
  28. ...
  29. ]
  30. }
  31. ...

webpack config 优化

  1. const cssLoaders = (...loaders) => [
  2. 'style-loader',
  3. {
  4. loader:'css-loader',
  5. {
  6. loader:'css-loader',
  7. options:{
  8. modules:{
  9. compileType:'icss' //支持export
  10. }
  11. }
  12. },
  13. },
  14. ..._loaders
  15. ]
  16. ...
  17. module: {
  18. rules:[
  19. ...
  20. {
  21. test: /\.s[ac]ss$/i,
  22. use:cssLoaders({
  23. loader:'sass-loader',
  24. options:{
  25. additionalData:`@import "~@/xxx.scss";`,
  26. sassOptions:{
  27. includePaths:[__dirname]
  28. }
  29. }
  30. })
  31. },
  32. {
  33. test: /\.less$/i,
  34. use:cssLoaders({
  35. loader:'less-loader',
  36. options:{
  37. additionalData:`@import "~@/xxx.less";`
  38. }
  39. })
  40. },
  41. {
  42. test: /\.styl(us)$/i,
  43. use:cssLoaders({
  44. stylusOptions:{
  45. import:[path.resolve(__dirname,'src/stylus-vars.stylus')]
  46. }
  47. })
  48. }
  49. ...
  50. ]
  51. }
  52. ...

生产环境提取单独的CSS文件

https://webpack.js.org/plugins/mini-css-extract-plugin/

λ yarn add mini-css-extract-plugin --dev
webpack.config.js

  1. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  2. ...
  3. const mode='production'
  4. const cssLoaders = (...loaders) => [
  5. mode === ' production' ? MiniCssExtractPlugin.loader : 'style-loader',
  6. {
  7. loader:'css-loader',
  8. {
  9. loader:'css-loader',
  10. options:{
  11. modules:{
  12. compileType:'icss' //支持export
  13. }
  14. }
  15. },
  16. },
  17. ..._loaders
  18. ]
  19. ...
  20. module.exports={
  21. mode:mode
  22. ...
  23. plugins:[
  24. new ESLintPlugin({
  25. extensions:['.js','.jsx','.ts','.tsx']
  26. }),
  27. new MiniCssExtractPlug({
  28. filename:'[name].[contenthash].css' //给css加hash
  29. })
  30. ],
  31. output:{
  32. filename:'[name].[contenthash].js' //给js加hash
  33. },
  34. ...
  35. module:{
  36. ...
  37. }
  38. }
  39. ...

自动生成HTML

https://webpack.js.org/plugins/html-webpack-plugin/
λ yarn add html-webpack-plugin --dev

  1. const HtmlWebpackPlugin = require('html-webpack-plugin')
  2. ...
  3. const mode='production'
  4. const cssLoaders = (...loaders) => [
  5. mode === ' production' ? MiniCssExtractPlugin.loader : 'style-loader',
  6. {
  7. loader:'css-loader',
  8. {
  9. loader:'css-loader',
  10. options:{
  11. modules:{
  12. compileType:'icss' //支持export
  13. }
  14. }
  15. },
  16. },
  17. ..._loaders
  18. ]
  19. ...
  20. module.exports={
  21. mode:mode
  22. ...
  23. plugins:[
  24. new ESLintPlugin({
  25. extensions:['.js','.jsx','.ts','.tsx']
  26. }),
  27. mode === 'production' && new MiniCssExtractPlug({
  28. filename:'[name].[contenthash].css' //给css加hash
  29. }),
  30. new HtmlWebpackPlugin()
  31. ].filter(Boolean),
  32. output:{
  33. filename:'[name].[contenthash].js' //给js加hash
  34. },
  35. ...
  36. module:{
  37. ...
  38. }
  39. }
  40. ...