打包工具

发布时间 2023-03-25 23:54:22作者: 转角90

所有打包工具是基于node运行的

1. Webpack

内置模块

  • path
    • extname: 后缀名
    • basename: 文件名
    • dirname:文件的父级文件夹路径
    • join(x,y): 路径拼接,
    • resolve(): 返回绝对路径

安装

npm webpack webpack-cli -D

webpack-cli: 识别命令行中 webpack 的命令,如果只是在js文件中使用webpack,则不用

webpack的运行依赖webpack-cli

基本配置

webpack.config.js固定名字

const path = require('path')
module.exports = {
    mode:'development',   // 默认是生产环境
    context:'',  // 默认值是webpack启动路径,
    entry:'./src/main.js', // 入口 相对于context
    output: {
        filename:'bundle.js'
        path:path.resolve(__dirname,'./build')
    },
    module: {  
        rules:[  // 配置loader 解析配置文件
            {  
                test:/\.css$/,
                use:[
                   	// 执行顺序是从列表的左边向右解析
             		{loader:'style-loader'}  // 插入到页面中
                    {loader:'css-loader'},  // 只负责解析
            		{
                        loader:'postcss-loader',
                        options:{
                            postcssOptions:{
                                plugins:[
                                	'autoprefixer'
                            	]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
}

指定配置文件:package.json中可以通过stripts:

loader

webpack对除了js文件以外的文件,不支持处理

loader: 处理模块,对源码进行转换

常用loader:

  • css-loader: 只负责css解析

  • style-loader: 将css插入页面中

  • less-loader: 解析less文件成css

  • postcss-loader:通过js进行转换样式的工具,如浏览器前缀,css样式的重置

    • autoprefixer: 浏览器前缀插件

      可以通过 postcss.config.js 进行配置,

      module.exports = {
          plugins:[
              // 'autoprefixer'
              'postcss-preset-env'
          ]
      }
      
    • postcss-preset-env: 将很多插件预设好了

  • babel-loader: 将ES6转为ES5

    • @babel/preset-env

      // babel.config.js
      module.exports = {
          //plugins:[
          //    @babel/plugin-xxxxxxxx
          //]
          presets:[
              @babel/preset-env
          ]
      }
      

资源模块

webpack5 之前在处理资源的时候,需要使用各种loader: raw-loader,url-loader,file-loader,

webpack5之后,可以直接使用资源模块类型 asset module type

资源模块类型

  1. asset/resource: 发送一个单独的文件并导出URL , 与file-loader对应
  2. asset/inline:导出一个资源的 data URL ,与url-loader对应
  3. asset/source:导出资源的源码,与raw-loader对应
  4. asset:在导入一个data URL 和发送一个单独的文件之间自动选择,url-loader 配置资源体积限制实现
// webpack.config.js

...

rules:[
    ...
    {
        test:/\.(png|jpe?g|gif|svg)$/ig,
        type:'asset',
        generator:{
            // 占位符 
            // name 文件名 
            // ext 扩展名 
            // hash hash:2 前两位
            filename:'img/[name].[hash:6][ext]'
        },
        parser:{
            dataUrlCondition:{
                maxSize: 60*1024
            }
        }
    }
]

extensions和alias配置

extensions: 文件扩展名配置

​ 如果是文件,当不写扩展名时,尝试去extensions中查找

​ 如果是文件夹,去当前文件夹下查找index.js

alias: 配置别名

module.exports = {
  //...
  resolve: {
    extensions: ['.js', '.json', '.wasm','vue','ts'],  
  },
  alias:{
      utils:path.resolve(__dirname,'./utils')
  }
};

插件 Plugin

loader用来转换特定类型的模块,plugin可以用于执行更加广泛的任务,如打包优化,资源管理,环境变量注入等

  • clean-webpack-plugin: 清除打包文件

  • html-webpack-plugin:

  • DefinePlugin: 内置的

const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {DefinePlugin} =  require('webpack')
module.exports = {
  //...
  
  plugins:[
      new CleanWebpackPlugin(),
      new HtmlWebpackPlugin({
          title:'自定义模板',
          template:'./index.html'
      })
      new DefinePlugin({
      	"BASE_URL":'"./"'
      })
  ]
};
// index.html

Mode配置

  • production: 默认
  • none:不使用任何默认优化选项
  • development:

开启本地服务器

想要自动完成编译和展示

  • webpack watch mode

  • webpack-dev-server

    {
        ...
        scripts:{
            'serve':'webpack serve --config webpack.config.js'
        }
    }
    
    // npm run serve
    
  • webpack-dev-middle

模块热更新(HMR)

应用程序运行过程中,添加、替换、删除模块,无需重新刷新整个页面

{
    ...
    devServer:{
        hot: true  // 默认是true
        
    }
}

// 指定哪个模块需要HMR

if (module.hot){
    module.hot.accept('./utils.js')
}

devServer配置

{
    devServer:{
      	port:8888, // 端口号
        host:'0.0.0.0', // 其他都可访问
        open:true, // 是否要自动打开浏览器
        compress:true// 是否对文件进行压缩
    }
}

环境配置

Vue脚手架早期:

​ webpack.dev.config.js:开发环境

​ webpack.pro.config.js:生产环境

​ webpack.comm.config.js: 公共部分,

​ 使用webpack-merge 将公共部分和私有部分合并, merge(coom,{自定义})

分包

vue3 中使用import函数导入模块自动分包

const Home = () => import(/webpackChunkName: 'home'/, './views/Home.vue')

2. gulp

3. rollup

4. Vite