webpack-模块打包器

什么是webpack

webpack可以理解为 模块打包器.
可以将我们网页应用程序中所依赖的各种资源(图片/css/js/sass/.vue/…)当成模块引入
webpack进行模块打包,打包成浏览器可以使用模块
使用场景:更适用于 单页面应用
vue+webpack (vuecli就是搭建好的webpack的开发环境)
react+webpack(create-react-app)
入口函数:在入口函数中可以通过commonjs模块化(nodejs)或者es6模块化来引入各种类型的资源
出口函数:入口函数中 引入各种资源,webpack处理后,形成一个新的js文件

安装webpack

npm init 
npm i webpack webpack-cli -D

注意:
一个软件(插件如webpack) 如果不是全局安装的,命令行执行运行 这个命令会报错
命令行中运行是全局安装的插件
如何运行项目本地安装的插件(软件)
package.json新增一个脚本,在脚本中运行这个 命令即可

webpack默认配置

webpack默认的入口文件是 src/index.js
默认的出口是 dist目录下 dist/main.js

自定义webpack配置

项目根目录下创建 webpack.config.js

webpack 的 模板字符串 以及预定义的一些变量

“[webpack预定义好的变量]”
哪些变量

name 入口函数的名字
hash 生成随机数 根据入口函数内容生成

单入口配置

  // 单入口配置
  entry: path.join(__dirname, 'src/main.js'),
  // 指定webpack的出口
  output: {
    // 出口目录
    path: path.join(__dirname, 'dist'),
    // 出口文件名
    filename: '[name].[hash:8].js'
  } 

多入口配置

entry:{
    a: path.join(__dirname, 'src/main.js'),
    b: path.join(__dirname, 'src/main2.js')
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].[hash:8].js'
    /* 
    [] 可以理解为 字符串中模块字符串 里面可以写变量
    name: 入口名字叫什么 name就是什么 a.js b.js
    hash 随机数 根据内容 生成随机数
    :8限制 随机数的长度
    */
  }

webpack中模板定义 定义项目中的模板文件(html)

html-webpack-plugin
功能是配置 项目中的模板文件(html文件),自动将出口文件,自动引入html文件中
webpack插件:

npm i html-webpack-plugin -D
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    plugins: [
    new HtmlWebpackPlugin({
      title: '你好webpack',
      // 定义模板的目录
      template: path.join(__dirname,'src/public/index.html')
    })
  ]
}



webpack loader

模块解析器
功能:用于解析 非 js文件

解析非js文件 需要loader
不同文件类型有不同的loader

loader配置

module.exports = {
   module: { // 定义不同loarder配置规则
    rules: [
      { test: /\.css$/, use: ['style-loader', 'css-loader'] }
    ],
  },
}
/*
test是一个正则:代表以 .xxx结尾文件
use: 匹配这个规则  的文件使用什么loader来解析
use写法有三种
	1,只有一个loader
	 { test: /\.css$/, use: 'style-loader' }
	2, 多个loader 两种写法
	 use是数组 里面直接写loader名
	 { test: /\.css$/, use: ['style-loader','css-loader'] }
	 use还是一个数组 里面写 对象
	 好处是 使用某个loader还可以传can
	 { test: /\.css$/, use: [
	 	{
	 		loader:"style-loader",
	 		options: {
	 			
	 		}
	 	},
	 	{
	 		loader:"css-loader",
	 		options: {
	 			
	 		}
	 	}
	 ] }
*/

解析 css

css-loader

npm i css-loader style-loader -D


module.exports = {
  module: {
    rules: [ // 在这里配置不同loader的规则
      {
        test: /\.css$/, // 以.css结尾文件
        // use: 'css-loader' 直接写loader
        // use:['style-loader','css-loader'], //同时使用多个loader,注意解析顺序从后往前
        use: [
          {
            loader: 'style-loader'
          },
          {
            loader: 'css-loader',
            options: { // 使用loader时可以传配置
              sourceMap: true
            }
          }
        ]
      }
    ]
  }
}

解析 less

npm i less less-loader -D
// 如果是sass
npm i node-sass sass-loader
less-loader 是将.less 解析 成css

es6转es6 babel

npm install -D babel-loader @babel/core @babel/preset-env

{
  rules: [
    {
      test: /\.m?js$/,
      exclude: /node_modules/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: [
            ['@babel/preset-env', { targets: "defaults" }]
          ]
        }
      }
    }
  ]
}

解析 图片 音频 字体 视频 等静态资源

file-loader

    {
        test: /\.(png|jpe?g|gif)$/i,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: 'imgs/[name].[hash:8].[ext]'
              // ext设计代表后缀名
            }
          },
        ],
      },

url-loader解析静态资源

dataURL base64格式
使用跟file-loader很像,url-loader可以将静态资源解析成 dataURL格式(base64)
好处:减少http请求
url-loader:包含了file-loader
定义url-loader 定义 解析文件的 体积 (小于这个体积的解析成base64 大于这个体积自动使用file-loader)

{
        test: /\.(png|jpe?g|gif)$/i,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 1024,
              fallback: {
                loader: 'file-loader',
                options: {
                  name: 'imgs/[name].[hash:8].[ext]'
                }
              },
            }
          },
        ],

clean-webpack-plugin

每一次 build代码前 自动删除

babel-loader 解析 es6

npm install -D babel-loader @babel/core @babel/preset-env

{
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              ['@babel/preset-env', { targets: "defaults" }]
            ]
          }
        }
      }

服务器

npm i webpack-dev-server
需要注意:webpack-cli需要回退版本安装3.x版本
eg: “webpack-cli”: “^3.3.12”,

// 服务器
  devServer: {
    // 服务器监听根目录
    contentBase: path.join(__dirname, 'dist'),
    // 开启服务器 gzip压缩 提高网页打开速度
    compress: true,
    port: 3000,
    // 热加载
    hot: true,
    open: true
  },

resolve

resolve:{
    // 定义模块引入时哪些文件可以省略后缀名
    extensions:['.js','.json','.vue'],
    // 定义路径别名
    alias:{
      '@': path.resolve(__dirname,'src')
    }
  }

搭建 vue spa应用

安装三个插件
vue-loader 解析vue单文件组件
vue-template-compiler 解析 vue模板
vue-style-loader 将单文件组件style标签中的css 通过头部style标签作用到页面上

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
  // mode 模式 development不压缩 默认 production 压缩
  mode: 'development',
  // 定义入口 单入口
  entry: path.join(__dirname, 'src/main.js'),
  // 定义出口
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'chunk.[hash:8].js'
  },
  module: { // 定义不同loarder配置规则
    rules: [
      { test: /\.vue$/, use: ['vue-loader'] },
      { test: /\.css$/, use: ['style-loader', 'css-loader'] },
      { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },

      {
        test: /\.(png|jpe?g|gif)$/i,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 1024,
              fallback: {
                loader: 'file-loader',
                options: {
                  name: 'imgs/[name].[hash:8].[ext]'
                }
              },
            }
          },
        ],
      },
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              ['@babel/preset-env', { targets: "defaults" }]
            ]
          }
        }
      }
    ],
  },
  // 定义webpack插件 比如 处理 模板文件 html
  plugins: [
    new HtmlWebpackPlugin({
      title: '你好webpack',
      // 定义模板的目录
      template: path.join(__dirname, 'public/index.html')
    }),
    new CleanWebpackPlugin(),
    new VueLoaderPlugin()
  ],
  // 服务器
  devServer: {
    // 服务器监听根目录
    contentBase: path.join(__dirname, 'dist'),
    // 开启服务器 gzip压缩 提高网页打开速度
    compress: true,
    port: 3000,
    // 热加载
    hot: true,
    open: true
  },
  resolve:{
    // 定义模块引入时哪些文件可以省略后缀名
    extensions:['.js','.json','.vue'],
    // 定义路径别名
    alias:{
      '@': path.resolve(__dirname,'src')
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值