1. CSS的引入
      image.png

      1. 安装: npm install css-loader style-loader --save

    app.js:

    1. import "./test.css";
    2. import "./test2.css";
    3. console.log(123);

    webpack.Config.js:
    注意:要先css-loader, 然后style-loader,但是写在后面的先执行,所以要先写style-loader。

    1. module.exports = {
    2. entry: {
    3. app: './app.js'
    4. },
    5. output: {
    6. path: __dirname+"/src/dist",
    7. filename: './[name].bundle.js'
    8. },
    9. module: {
    10. rules: [
    11. {
    12. test: /\.css$/,
    13. use: [
    14. {
    15. loader: "style-loader"
    16. },
    17. {
    18. loader: "css-loader"
    19. }
    20. ]
    21. }
    22. ]
    23. }
    24. }

    打包结果:
    image.png

    打开index.html,发现css已经生效,控制台也有相应日志输出。
    image.png

    image.png
    config配置文件:
    以下写法 insertInto, singleton在style-loader中,已不支持,需要安装0.版本。

    1. module: {
    2. rules: [
    3. {
    4. test: /\.css$/,
    5. use: [
    6. {
    7. loader: "style-loader",
    8. options: {
    9. //insertAt: 'top' / 'bottom' //相对于头部的top和bottom
    10. // insertAt: {
    11. // before: '#mydiv'
    12. // },
    13. insertInto: "#mydiv", // 插入到id为mydiv dom元素里
    14. singleton: true // 是否将多个style标签合并为一个标签
    15. }
    16. },
    17. {
    18. loader: "css-loader"
    19. }
    20. ]
    21. }
    22. ]
    23. }

    结果见下图:
    image.png

    transform: 可以在css被插入之前对css进行js修改,指定处理css的js文件。
    transform: ‘./transform.js’

    1. module: {
    2. rules: [
    3. {
    4. test: /\.css$/,
    5. use: [
    6. {
    7. loader:"style-loader",
    8. options:{
    9. insertInto:"#mydiv",
    10. singleton: true,
    11. transform: './transform.js'
    12. }
    13. },
    14. {
    15. loader:"css-loader"
    16. }
    17. ]
    18. }
    19. ]
    20. }

    transform.js:

    1. module.exports = function(css) {
    2. if(window && window.screen.width < 500) {
    3. css = css.replace('red','yellow');
    4. }
    5. return css;
    6. }
    1. css-loader
      image.png
      minimize,alias: 已经在webpack4中去除了。
      1. {
      2. loader:"css-loader",
      3. options: {
      4. modules: true
      5. }
      6. }

    test2.css

    1. body{
    2. font-size: 20px;
    3. }
    4. /* 全局样式 border-white */
    5. :global .border-white{
    6. border: 4px solid white;
    7. }
    8. /* 局部样式 border-white */
    9. :local .div1{
    10. width: 100px;
    11. height: 100px;
    12. background-color: pink;
    13. /* composes: border-white; */
    14. /* 继承border-white, 还可以从其他文件继承,如下 */
    15. composes: border-yellow from './test.css';
    16. }

    test.css:

    1. *{
    2. background-color: red;
    3. }
    4. .border-yellow{
    5. border: 4px solid yellow;
    6. }

    html运行结果:
    可以发现,标记为局部和没有任何标记的类名会被重新编码,所以导致类没有起作用。
    image.png

    那怎么办呢?
    需要在app.js中对用到的类进行处理一下:

    1. import test from "./test.css";
    2. import test2 from "./test2.css";
    3. console.log(123);
    4. document.getElementById('mydiv').setAttribute('class', test2.div1);

    在看index.html的运行结果:
    image.png

    如果想指定css类名:

    name为css文件名,local为原类名。

    1. {
    2. loader:"css-loader",
    3. options: {
    4. modules: {
    5. localIdentName: '[path][name]_[local]_[hash:4]'
    6. }
    7. }
    8. }

    运行结果:
    image.png

    1. less和sass等预处理语言的编译
      image.png

    将上例子中的css都改为less文件,引用的地方也需要改:
    test.less: 定义了一个@base的变量。

    1. @base: green;
    2. *{
    3. background-color: red;
    4. }
    5. .border-yellow{
    6. border: 4px solid @base;
    7. }
    1. 提取css到一个文件
      image.png

    webpack4.0中要安装next版本,而且它是依赖局部webpack的,所以要安装一个局部的webpack才能使用。
    npm install extract-text-webpack-plugin@next webpack —save

    安装完后,需要改造config文件如下:

    1. var extractTextCss = require('extract-text-webpack-plugin');
    2. module.exports = {
    3. entry: {
    4. app: './app.js'
    5. },
    6. output: {
    7. path: __dirname+"/src/dist",
    8. filename: './[name].bundle.js'
    9. },
    10. module: {
    11. rules: [
    12. {
    13. test: /\.less$/,
    14. use: extractTextCss.extract({
    15. fallback: {
    16. loader:"style-loader",
    17. options:{
    18. insertInto:"#mydiv",
    19. singleton: true,
    20. transform: './transform.js'
    21. }
    22. },
    23. use: [
    24. {
    25. loader:"css-loader",
    26. options: {
    27. modules: {
    28. localIdentName: '[path][name]_[local]_[hash:4]'
    29. }
    30. }
    31. },
    32. {
    33. loader: "less-loader"
    34. }
    35. ]
    36. })
    37. }
    38. ]
    39. },
    40. plugins: [
    41. new extractTextCss({
    42. filename: '[name].min.css'
    43. })
    44. ]
    45. }

    postcss 和 postcss-loader
    PostCSS 的主要功能只有两个:第一个就是前面提到的把 CSS 解析成 JavaScript 可以操作的 AST(抽象语法树结构(Abstract Syntax Tree,AST)),第二个就是调用插件来处理 AST 并得到结果。因此,不能简单的把 PostCSS 归类成 CSS 预处理或后处理工具。PostCSS 所能执行的任务非常多,同时涵盖了传统意义上的预处理和后处理。PostCSS 是一个全新的工具,给前端开发人员带来了不一样的处理 CSS 的方式。

    安装:
    npm install postcss postcss-loader autoprefixer postcss-cssnext —save

    postcss-loader需要定义在预处理loader的后面,也就是less,sass-loader的后面。

    1. use: [
    2. {
    3. loader:"css-loader",
    4. options: {
    5. modules: {
    6. localIdentName: '[path][name]_[local]_[hash:4]'
    7. }
    8. }
    9. },
    10. {
    11. loader: 'postcss-loader',
    12. options:{
    13. ident:'postcss',
    14. plugins: [
    15. require('autoprefixer')()
    16. ]
    17. }
    18. },
    19. {
    20. loader: "less-loader"
    21. }
    22. ]

    修改test.less:

    增加flex。

    1. @base: green;
    2. *{
    3. background-color: red;
    4. }
    5. .border-yellow{
    6. border: 4px solid @base;
    7. display: flex;
    8. }

    webpack打包后,display: flex; 并没有被加上前缀。需要制定以什么样的浏览器为目标才可以。

    1. {
    2. loader: 'postcss-loader',
    3. options:{
    4. ident:'postcss',
    5. plugins: [
    6. require('autoprefixer')({
    7. "overrideBrowserslist": [
    8. ">1%", "last 2 versions"
    9. ]
    10. })
    11. ]
    12. }
    13. }

    查看css代码,可以发现flex已被加上了前缀。
    image.png

    需要兼容性编译的地方,都需要去指定编译目标。
    可以在package.json文件中指定:

    1. "browserslist": [
    2. ">1%", "last 2 versions"
    3. ]

    也可以在根目录下新建文件 .browserslistrc,来统一指定。

    在test.less中写入了cssnext的语法,也就是下一代css的语法:

    image.png

    更改config文件,添加 postcss-cssnext:

    1. {
    2. loader: 'postcss-loader',
    3. options:{
    4. ident:'postcss',
    5. plugins: [
    6. require('autoprefixer')(),
    7. require('postcss-cssnext')()
    8. ]
    9. }
    10. }

    webpack打包后可以看出已经生效啦。