初探webpack4---简介与常用loader使用方法

现在的网页开发都会拥有一系列的依赖,处理这些复杂、麻烦的依赖就应运而生了一些前端打包工具:webpack、rollup、grunt、gulp等

由于项目中使用居多的是webpack,所以就将webpack简单的使用方法进行了如下的整理,希望对大家有用~~

1、webpack的作用: 

  其实就是一个JavaScript应用程序的静态模块打包器

  webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。当webpack处理应用程序时,他会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle。  

2、webpack创建流程

    1⃣️安装node.js

     创建package.json文件: 记录项目所需要的模块以及版本

     命令: npm init

     2⃣️安装webpack
          npm install --save-dev webpack
          npm install --save-dev webpack-cli

3、默认打包

  默认entry 入口 src/index.js //自己手动创建
  默认output 出口 dist/main.js

4、打包模式:
  webpack --mode development //开发模式 生成的文件不会被压缩
  webpakc --mode production //生产模式 生成的文件会被压缩

  在package.json中的 script属性添加:

    "dev": "webpack --mode development"     //可以使用npm run dev 运行程序

    "build": "webpack --mode production"      //可以使用npm run build 打包程序

5、配置config文件

  (1)、在package.json 的同级目录创建一个webpack.config.js文件

  (2)、entry: 入口文件 

    单入口:
      单文件: eg: entry: './src/index.js'

      多文件:   // 在你想要多个依赖文件一起注入,并且将他们的依赖导向到一个"chunk"(打包口的一个文件)时,传入数组的方式就很有用
        eg: entry: ['./src/index.js', './src/index1.js', ...]

      多入口:将几个文件单独分离出来
        entry:{
          pageOne: "./src/pageOne/index.js",
          pageTwo: "./src/pageTwo/index.js",
          pageThree: "./src/pageThree/index.js",
        }

  (3)、output: 出口文件

    单出口:
      output:{
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
      }  

     多出口: 和多入口搭配使用
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].js', name 是多入口的 key值
      }

  (4)配置webpack-dev-server

     1、了解webpack-dev-server
        webpack-dev-server是用来配置本地服务器,使用它可以为webpack打包生成的资源文件提供web服务
        webpack-dev-server主要提供两个功能
          1、为静态资源提供web服务
          2、自动刷新和热替换(HMR)

     2、安装webpack-dev-server
        npm instal webpack-dev-server --save-dev

     3、配置webpack.config.js
        devServer: {
          contentBase: './build', //设置服务器访问的基本目录
          host: 'localhost',
          port: '8000',
          open: true //自动打开页面?
        }

      4、配置package.json
        "start": "webpack-dev-server --model development"

  (5)常用loader使用方式

    1、作用:loader(让webpack能够处理那些非js文件),loader可以将所有类型的文件转换为webpack能够处理的有效模块

    2、加载CSS      

      安装style-loader 和 css-loader

        下载 npm install style-loader css-loader --save-dev

      配置loader
        在webpack.config.js文件中配置module 中的rules
          在webpack的配置中loader有两个目标
            1、test 属性,用于标识出应该被对应的loader进行转换的某个或某些文件
            2、use 属性,表示进行转换时,应该使用哪个loader
          对于css文件需要两个loader css-loader、style-loader
          只加入css-loader样式不起作用
          所以需要两个loader(style-loader 必须写在前面要不打包会出错)

    3、加载less和sass

      less
        less处理效果
          @ 10px;
          @height: @width + 10px;

          #header{
             @width;
            height: @height;
          }
          转换后
            #header{
               10px;
              height: 20px
            }
        安装 less-loader 和 less
          npm install less-loader less --save-dev

        配置webpack.config.js文件中的module 中的rules
          {
            test: /.less$/,
            use: ['style-loader', 'css-loader', 'less-loader']
          }

      sass

        安装 asss-loader 和 node-sass
          npm install sass-loader node-sass --save-dev

        配置 webpack.config.js文件中的module中的rules
          {
            test: /.less$/,
            use: ['style-loader', 'css-loader', 'sass-loader']
          }

    4、PostCSS处理浏览器前缀  

      处理效果:
        #header{
          display: flex;
           100px;
          height: 100px;
        }
      处理后:
        #header{
          display: -webkit-box;
          display: -webkit-flex;
          display: flex;
           100px;
          height: 100px;
        }

      安装loader
        安装postcss-loader 和 autoprefixer
      下载 npm install postcss-loader autoprefixer --save-dev

       配置: webpack.config.js 有三种方式:

        方式一:
          use: ['style-loader', 'css-loader', 'sass-loader', {
            loader: 'postcss-loader',
            options: {
              plugins: [
                require('autoprefixer')({
                  browsers: [
                    "ie >= 8",
                    "Firefox >= 20",
                    "Safari >= 5",
                    "Android >= 4",
                    "Ios >= 6",
                    "last 4 version"
                  ]
                })
              ]
            }
          }]
        方式二:
          use: ['style-loader', 'css-loader', 'sass-loader', {
            loader: 'postcss-loader',
            options: {
              plugins: [
                require('autoprefixer')
              ]
            }
          }]
          需要在 package.json 中配置浏览器版本
            "browserslist": [
              "ie >= 8",
              "Firefox >= 20",
              "Safari >= 5",
              "Android >= 4",
              "Ios >= 6",
              "last 4 version"
            ]
        方式三: 建议使用这一种方式
          use: ['style-loader', 'css-loader', 'sass-loader', 'postcss-loader']
            添加postcss.config.js
              module.exports = {
                plugins: [
                  require('autoprefixer')
                ]
              };
            需要在 package.json 中配置浏览器版本
              "browserslist": [
                "ie >= 8",
                "Firefox >= 20",
                "Safari >= 5",
                "Android >= 4",
                "Ios >= 6",
                "last 4 version"
              ]

     5、文件处理

        图片处理 

          安装loader
            下载 file-loader
              npm install file-loader --save-dev
            配置config文件
              module: {
                rules: [
                  {
                    test: /.(png|jpg|gif|jpeg)$/,
                    use: 'file-loader'
                  }
                ]
              }
            选项配置:
              module: {
                rules: [
                  {
                    test: /.(png|jpg|gif|jpeg)$/,
                    use: [
                      {
                        loader: 'file-loader',
                        options: {
                          name: '为你的文件配置自定义文件名模版',
                          context: '配置自定义文件的上下文,默认为webpack.config.js', [path] 相对于这个目录的相对目录
                          pubilcPath: '为你的文件配置自定义public 发布目录', //可以设置域名
                          outputPath: '为你的文件配置自定义output输出目录'
                        }
                      }
                    ]
                  }
                ]
              }

        字体文件处理

          下载字体文件
            以bootstrap字体文件为例子
              BootStrap字体文件下载地址: https://v3.bootcss.com/getting-started/

            配置config文件
              module: {
                rules: [
                  {
                    test: /.(ttf|woff2|eot|svg)$/,
                    use: [{
                      loader: 'file-loader',
                      options: {
                        outputPath: 'font/'
                      }
                    }]
                  }
                ]
              }

        第三方js库处理

          以Jquery为例子
            (1)本地导入:
              编写配置文件
                webpack.ProvidePlugin参数是键值对形式,键就是我们项目中使用的变量,值就是键所指向的库。webpack.ProvidePlugin会先从npm安装的包中查找是否有符合的库
                如果webpack配置了resolve.alias选项(理解成"别名"),那么webpack.ProvidePlugin就会顺着设置的路径一直找下去
                使用webpack.ProvidePlugin前需要引入webpack
                const webpack = require('webpack')
                resolve: {
                  alias: {
                    jQuery: path.resolve(__dirname, 'public/js/jQuery.min.js')
                  }
                },
                plugins: [
                  new webpack.ProvidePlugin({
                    jQuery: "jQuery"
                  })
                ]
            (2)npm 安装 jquery
              命令: npm install jquery --save-dev
              在需要使用的js文件中使用 import $ from 'jquery'

     6、使用babel-loader编译ES6

        babel转换语法所需要的依赖
        babel-loader: 负责ES6语法转换
        babel-core: babel核心包
        babel-preset-env: 告诉babel使用那种转码规则进行文件处理

      安装依赖:
        npm install babel-loader @babel/core @babel/preset-env --save-dev

      配置config文件:
        exclude表示不在指定目录查找相关文件
        module: {
          rules: [
            {
              test: /.js$/,
              exclude: /node_modules/,
              use: 'babel-loader'
            }
          ]
        }
        新建.babelrc文件配置转换规则
          {
            "presets":["@babel/preset-env"]
          }
        另一种配置方法:
          在config文件中
            module: {
              rules: [
                {
                  test: /.js$/,
                  exclude: /node_modules/,
                  use: 'babel-loader',
                  options: {
                    preset: ['@babel/preset-env']
                  }
                }
              ]
            }

        

原文地址:https://www.cnblogs.com/webtaotao/p/12102296.html