从0搭建webpack开发环境(二)

157 阅读4分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

在webpack的配置项中,我们可以通过 config 参数指定,使用哪个配置文件来进行打包 

通过env参数区分


"scripts": {

    "build": "webpack --env.production --config ./build/webpack.base",

    "dev": "webpack --env.development --config ./build/webpack.base"

}

改造webpack.base文件默认导出函数,会将环境变量传入到函数的参数中


module.exports = (env)=>{

    console.log(env); // { development: true }

}

合并配置文件

我们可以判断当前环境是否是开发环境来加载不同的配置,这里我们需要做配置合并   

安装webpack-merge:


npm install webpack-merge --save-dev

webpack.dev配置


module.exports = {

    mode:'development'

}

webpack.prod配置


module.exports = {

    mode:'production'

}

webpack.base配置


const path = require('path');

const merge = require('webpack-merge');

// 开发环境

const dev = require('./webpack.dev');

// 生产环境

const prod = require('./webpack.prod');

const base = { // 基础配置

    entry:'./src/index.js',

    output:{

        filename:'bundle.js',

        path:path.resolve(__dirname,'../dist')

    }

}

module.exports = (env) =>{

    if(env.development){

        return merge(base,dev);

    }else{

        return merge(base,prod)

    }

}

后续的开发中,我们会将公共的逻辑放到base中,开发和生产对的配置也分别进行存放!

4.webpack-dev-server

配置开发服务器,可以在实现在内存中打包,并且自动启动服务


npm install webpack-dev-server --save-dev


"scripts": {

    "build": "webpack --env.production --config ./build/webpack.base",

    "dev": "webpack-dev-server --env.development --config ./build/webpack.base"

}

通过执行npm run dev来启启动开发环境

默认会在当前根目录下启动服务

配置开发服务的配置


const path = require('path')

module.exports = {

    mode:'development',

    devServer:{

        // 更改静态文件目录位置

        contentBase:path.resolve(__dirname,'../dist'),

        compress:true, // 开启gzip

        port:3000, // 更改端口号

    }

}

5.打包Html插件

5.1 单入口打包

自动产生html,并引入打包后的文件

编辑webpack.base文件





const HtmlWebpackPlugin = require('html-webpack-plugin');

plugins:[

    new HtmlWebpackPlugin({

        filename:'index.html', // 打包出来的文件名

        template:path.resolve(__dirname,'../public/index.html'),

        hash:true, // 在引用资源的后面增加hash戳

        minify:{

            removeAttributeQuotes:true // 删除属性双引号

        }

    })

]

5.2 多入口打包

根据不同入口 生成多个js文件,引入到不同html中


── src

    ├── entry-1.js

    └── entry-2.js

多入口需要配置多个entry


entry:{

    jquery:['jquery'], // 打包jquery

    entry1:path.resolve(__dirname,'../src/entry-1.js'),

    entry2:path.resolve(__dirname,'../src/entry-2.js')

},

output:{

    filename:'[name].js',

    path:path.resolve(__dirname,'../dist')

},

产生多个Html文件


new HtmlWebpackPlugin({

    filename:'index.html', 

    template:path.resolve(__dirname,'../public/template.html'),

    hash:true, 

    minify:{

        removeAttributeQuotes:true

    },

    chunks:['jquery','entry1'], // 引入的chunk 有jquery,entry

}),

new HtmlWebpackPlugin({

    filename:'login.html',

    template:path.resolve(__dirname,'../public/template.html'),

    hash:true,

    minify:{

        removeAttributeQuotes:true

    },

    inject:false, // inject 为false表示不注入js文件

    chunksSortMode:'manual', // 手动配置代码块顺序

    chunks:['entry2','jquery']

})

以上的方式不是很优雅,每次都需要手动添加HtmlPlugin应该动态产生html文件,像这样:


let htmlPlugins = [

  {

    entry: "entry1",

    html: "index.html"

  },

  {

    entry: "entry2",

    html: "login.html"

  }

].map(

  item =>

    new HtmlWebpackPlugin({

      filename: item.html,

      template: path.resolve(__dirname, "../public/template.html"),

      hash: true,

      minify: {

        removeAttributeQuotes: true

      },

      chunks: ["jquery", item.entry]

    })

);

plugins: [...htmlPlugins]

6.清空打包结果

可以使用clean-webpack-plugin手动清除某个文件夹内容:

安装


npm install --save-dev clean-webpack-plugin


const { CleanWebpackPlugin } = require('clean-webpack-plugin');

new CleanWebpackPlugin({

    // 清空匹配的路径

    cleanOnceBeforeBuildPatterns: [path.resolve('xxxx/*'),'**/*'],

})

这样就可以清空指定的目录了,我们可以看到webpack插件的基本用法就是 new Plugin并且放到plugins

• 随着项目业务的复杂度增加,工程模块的体积也会急剧增大,构建后的模块通常要以M为单位计算;

• 代码全量构建速度过慢,即使是很小的改动,也要等待长时间才能查看到更新与编译后的结果(引入HMR热更新后有明显改进);

• 多个项目之间共用基础资源存在重复打包,基础库代码复用率不高;

• node的单进程实现在耗cpu计算型loader中表现不佳;

优化方案

• 减少编译体积大小

• 将大型库外链

• 将库预先编译

• 使用缓存并行编译

使用hash缓存

vue的脚手架

C:\Users\User>vue --help
Usage: vue <command> [options]

Options:
  -V, --version    查看当前vue\cli版本号
  -h, --help       在控制台输出帮助命令

命令行中 [] 表示可选命令   <> 表必须命令
Commands:
	根据开发者提供的项目名称创建项目  ==> 会在指定目录下构建项目文件夹
    	项目名称 不能使用驼峰方式
    	项目名称 最好不要使用中文
  * create [options] <app-name>
  	为项目增加扩展插件功能 (只会按照脚手架能够识别的模块)
  		自动识别 --save 和 --save-dev 环境 ==> 自动执行 npm install 
  		自动安装依赖,自动添加默认配置 ==> 自动完成项目 vue.config.js 文件配置         
  * add [options] <plugin> [pluginOptions]  
  	对项目中的插件进行 配置更新
  invoke [options] <plugin> [pluginOptions] 
   	项目配置输出
  inspect [options] [paths...] 
  	驱动简易的vue环境
  serve [options] [entry]
  	基于webpack打包项目
  		将JS CSS html …… 语法转换为兼容语法
  		生成 纯静态文件
  build [options] [entry]
  	开启 vue-cli 管理器页面,通过图形化管理电脑中的所有vue项目
  * ui [options]   
  	根据外部模板创建功能(vue-cli 2.0 版本项目构建)旧项目结构
  		依赖于额外全局模块@vue/cli-init ==> npm install -g @vue/cli-init
  init [options] <template> <app-name>  
  	配置文件的修改操作
  config [options] [value]  
  	vue项目的配置升级
  upgrade [semverLevel]  
  	用于启动查看 调试信息
  info   
  	查看子命令的帮助手册
  Run vue <command> --help