webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle
javascript
使用Webpack做为前端构建工具:html
在webpack
应用中有两个核心:前端
├── src # 源码目录 │ ├── a-module.js │ └── index.js
编写 a-module.jsjava
module.exports = 'hello';
编写 index.jsnode
let a = require('./a-module'); console.log(a);
这里咱们使用
CommonJS
模块的方式引入,这种方式默认在浏览器上是没法运行的,咱们但愿经过webpack
来进行打包!jquery
npm init -y npm install webpack webpack-cli --save-dev
webpack
默认支持0配置,配置scripts
脚本webpack
"scripts": { "build": "webpack" }
执行npm run build
,默认会调用 node_modules/.bin
下的webpack
命令,内部会调用webpack-cli
解析用户参数进行打包。默认会以 src/index.js
做为入口文件。web
这里也可使用
npx webpack
,npx
是 5.2版本以后npm
提供的命令能够执行.bin
下的可执行文件npm
咱们能够发现已经产生了dist
目录,此目录为最终打包出的结果。main.js
能够在html中直接引用,这里还提示咱们默认mode
为production
json
咱们打包时通常不会采用0配置,webpack
在打包时默认会查找当前目录下的 webpack.config.js or webpackfile.js
文件。
经过配置文件进行打包
const path = require('path'); module.exports = { entry:'./src/index.js', output:{ filename:'bundle.js', // 打包出的结果文件 path:path.resolve(__dirname,'dist') // 打包到dist目录下 } }
咱们须要在打包时提供mode
属性来区分是开发环境仍是生产环境,来实现配置文件的拆分
├── build │ ├── webpack.base.js │ ├── webpack.dev.js │ └── webpack.prod.js
咱们能够经过指定不一样的文件来进行打包
配置scripts
脚本
"scripts": { "build": "webpack --config ./build/webpack.prod", "dev": "webpack --config ./build/webpack.dev" }
能够经过 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
中,开发和生产对的配置也分别进行存放!
配置开发服务器,能够在实如今内存中打包,而且自动启动服务
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, // 更改端口号 } }
自动产生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 // 删除属性双引号 } }) ]
根据不一样入口 生成多个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]
可使用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
中