WebPack能够看作是模块打包机:它作的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式以供浏览器使用。css
构建就是把源代码转换成发布到线上的可执行 JavaScrip、CSS、HTML 代码,包括以下内容:html
代码转换:TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等。 文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。 代码分割:提取多个页面的公共代码、提取首屏不须要执行部分的代码让其异步加载。 模块合并:在采用模块化的项目里会有不少个模块和文件,须要构建功能把模块分类合并成一个文件。 自动刷新:监听本地源代码的变化,自动从新构建、刷新浏览器。 代码校验:在代码被提交到仓库前须要校验代码是否符合规范,以及单元测试是否经过。 自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。 构建实际上是工程化、自动化思想在前端开发中的体现,把一系列流程用代码去实现,让代码自动化地执行这一系列复杂的流程。 构建给前端开发注入了更大的活力,解放了咱们的生产力。
初始化package.json前端
npm init -y
package.json 文件中node
"scripts": { "build": "webpack --profile --progress --colors --display-error-details", "dev": "webpack --display-modules --profile --progress --colors --display-error-details" },
color 输出结果带彩色,好比:会用红色显示耗时较长的步骤react
profile 输出性能数据,能够看到每一步的耗时jquery
progress 输出当前编译的进度,以百分比的形式呈现webpack
display-modules 默认状况下 node_modules 下的模块会被隐藏,加上这个参数能够显示这些被隐藏的模块web
display-error-details 输出详细的错误信息正则表达式
全局安装npm
npm install webpack -g
本地安装
npm install webpack webpack-cli -D//-D是指开发环境须要,上线不须要,下同
通常推荐本地安装,安装在本身的项目中,否则版本不一样会有不兼容。
npm install webpack webpack-cli -D
建立src
建立dist
建立index.html
配置文件webpack.config.js
entry:配置入口文件的地址
output:配置出口文件的地址
module:配置模块,主要用来配置不一样文件的加载器
plugins:配置插件
devServer:配置开发服务器
// 基于node的 遵循commonjs规范的
let path = require('path');//node的模块 module.exports = { entry:'./src/index.js', // 入口 output:{ filename:'build.js', // 这个路径必须是绝对路径 path: path.resolve('./dist') }, // 出口 devServer:{ contentBase:'./dist', port:8080, compress:true,// 服务器压缩 open:true,// 自动打开浏览器 // hot:true//热更新 },// 开发服务器 module:{}, // 模块配置 plugins:[], // 插件的配置 mode:'development', // 能够更改模式 resolve:{}, // 配置解析 } // 在webpack中如何配置开发服务器 webpack-dev-server
配置开发服务器
npm i webpack-dev-server –D
contentBase 配置开发服务运行时的文件根目录
host:开发服务器监听的主机地址
compress 开发服务器是否启动gzip等压缩
port:开发服务器监听的端口
devServer:{ contentBase:path.resolve(__dirname,'dist'), host:'localhost', compress:true, port:8080 }//开发服务器 "scripts": { "build": "webpack --mode development", "dev": "webpack-dev-server --open --mode development " }//开启本地服务 npm run dev
入口文件的类型
这种状况不多,通常就以字符串的形式出现便可,例如:
entry: './src/index.js',
entry:['./src/index.js','./src/a.js']
有时候咱们的页面能够不止一个HTML页面,会有多个页面,因此就须要多入口
entry: { index: './src/index.js', main:'./src/main.js' }, output: { path: path.resolve(__dirname, 'dist'), filename: '[name].[hash].js', publicPath:PUBLIC_PATH }, new HtmlWebpackPlugin({ minify: { removeAttributeQuotes:true }, hash: true, template: './src/index.html', chunks:['index'], filename:'index.html' }), new HtmlWebpackPlugin({ minify: { removeAttributeQuotes:true }, hash: true, chunks:['main'], template: './src/main.html', filename:'main.html' })],
支持加载css文件
经过使用不一样的Loader,Webpack能够要把不一样的文件都转成JS文件,好比CSS、ES6/七、JSX等
test:匹配处理文件的扩展名的正则表达式
use:loader名称,就是你要使用模块的名称
include/exclude:手动指定必须处理的文件夹或屏蔽不须要处理的文件夹
query:为loaders提供额外的设置选项
loader三种写法
use loader use+loader
npm i style-loader css-loader -D
配置加载器
module: { rules:[ { test:/.css$/, use:['style-loader','css-loader'],//从右往左写,webpack特性 include:path.join(__dirname,'./src'), exclude:/node_modules/ } ] },
支持图片
npm i file-loader url-loader -D
file-loader 解决CSS等文件中的引入图片路径问题
url-loader 当图片较小的时候会把图片BASE64编码,大于limit参数的时候仍是使用file-loader 进行拷贝
let logo=require('./images/logo.png'); let img=new Image(); img.src=logo; document.body.appendChild(img); { test:/\.(jpg|png|gif|svg)$/, use:'url-loader', include:path.join(__dirname,'./src'), exclude:/node_modules/ }
还能够在CSS文件中引入图片
.img-bg{ background: url(./images/logo.png); width:173px; height:66px; }
自动产出html
插件是 wepback 的支柱功能。webpack 自身也是构建于,你在 webpack 配置中用到的相同的插件系统之上!
插件使用
npm install 插件名 -D
由于插件都是类,引用方式,在plugins数组中 new 插件名 便可使用。
npm i html-webpack-plugin -D
minify 是对html文件进行压缩,removeAttrubuteQuotes是去掉属性的双引号
hash 引入产出资源的时候加上哈希避免缓存
template 模版路径
plugins: [ new HtmlWebpackPlugin({ minify: { removeAttributeQuotes:true }, hash: true, template: './src/index.html', filename:'index.html' })]
分离CSS
由于CSS的下载和JS能够并行,当一个HTML文件很大的时候,咱们能够把CSS单独提取出来加载,webpack4中mini-css-extract-plugin也能够实现,可是目前bug比较多,不能分红多个css。
npm install --save-dev extract-text-webpack-plugin@next
{ test:/\.css$/, use: ExtractTextWebpackPlugin.extract({ use:'css-loader' }), include:path.join(__dirname,'./src'), exclude:/node_modules/ }, plugins: [ new ExtractTextWebpackPlugin('css/index.css'), ]
处理图片路径问题
const PUBLIC_PATH='/'; output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js', publicPath:PUBLIC_PATH }, // 指定打包后的图片位置 use: [ { loader: 'url-loader', options: { limit: 1024, outputPath:'images/' } } ],
在HTML中使用图片
npm i html-withimg-loader -D <div class="img-container "><img src="./images/logo.png" alt="logo.png"></div> { test:/.(html|html)$/, use:'html-withimg-loader', include:path.join(__dirname,'./src'), exclude:/node_modules/ }
编译less 和 sass
npm i less less-loader -D npm i node-saas sass-loader -D @color:orange; .less-container{ border:1px solid @color; } $color:green; .sass-container{ border:1px solid $color; } const cssExtract=new ExtractTextWebpackPlugin('css.css'); const lessExtract=new ExtractTextWebpackPlugin('less.css'); const sassExtract=new ExtractTextWebpackPlugin('sass.css'); { test:/\.less$/, use: lessExtract.extract({ use:['css-loader','less-loader'] }), include:path.join(__dirname,'./src'), exclude:/node_modules/ }, { test:/\.scss$/, use: sassExtract.extract({ use:['css-loader','sass-loader'] }), include:path.join(__dirname,'./src'), exclude:/node_modules/ },
处理CSS3属性前缀
为了浏览器的兼容性,有时候咱们必须加入-webkit,-ms,-o,-moz这些前缀
Trident内核:主要表明为IE浏览器, 前缀为-ms
Gecko内核:主要表明为Firefox, 前缀为-moz
Presto内核:主要表明为Opera, 前缀为-o
Webkit内核:产要表明为Chrome和Safari, 前缀为-webkit
npm i postcss-loader autoprefixer -D postcss-loader postcss.config.js module.exports={ plugins:[require('autoprefixer')] } .circle { transform: translateX(100px); { test:/\.css$/, use: cssExtract.extract({ use:['css-loader','postcss-loader'] }), include:path.join(__dirname,'./src'), exclude:/node_modules/ }, }
转义ES6/ES7/JSX
Babel实际上是一个编译JavaScript的平台,能够把ES6/ES7,React的JSX转义为ES5
npm i babel-core babel-loader babel-preset-env babel-preset-stage-0 babel-preset-react -D { test:/\.jsx?$/, use: { loader: 'babel-loader', options: { presets: ["env","stage-0","react"] } }, include:path.join(__dirname,'./src'), exclude:/node_modules/ },
webapck经过配置能够自动给咱们source maps文件,map文件是一种对应编译文件和源文件的方法
source-map 把映射文件生成到单独的文件,最完整最慢 cheap-module-source-map 在一个单独的文件中产生一个不带列映射的Map eval-source-map 使用eval打包源文件模块,在同一个文件中生成完整sourcemap cheap-module-eval-source-map sourcemap和打包后的JS同行显示,没有映射列 devtool:'eval-source-map'
拷贝静态文件
有时项目中没有引用的文件也须要打包到目标目录
npm i copy-webpack-plugin -D new CopyWebpackPlugin([{ from: path.join(__dirname,'public'),//静态资源目录源地址 to:'./public' //目标地址,相对于output的path目录 }]),
打包前先清空输出目录
npm i clean-webpack-plugin -D new cleanWebpaclPlugin(path.join(__dirname,'dist'))
压缩CSS
webpack能够消除未使用的CSS
npm i -D purifycss-webpack purify-css glob new PurifyCSSPlugin({//purifycss根据这个路径配置遍历你的HTML文件,查找你使用的CSS paths:require('glob').sync(path.join(__dirname,'src/*.html')) }),
resolve解析
指定extension以后能够不用在require或是import的时候加文件扩展名,会依次尝试添加扩展名进行匹配
resolve: { //自动补全后缀,注意第一个必须是空字符串,后缀必定以点开头 extensions: [" ",".js",".css",".json"], },
配置别名能够加快webpack查找模块的速度
每当引入jquery模块的时候,它会直接引入jqueryPath,而不须要从node_modules文件夹中按模块的查找规则查找
不须要webpack去解析jquery.js文件
const bootstrap=path.join(__dirname,'node_modules/bootstrap/dist/css/bootstrap.css') resolve: { alias: { 'bootstrap': bootstrap } },
区分环境变量
许多 library 将经过与 process.env.NODE_ENV 环境变量关联,以决定 library 中应该引用哪些内容。例如,当不处于生产环境中时,某些 library 为了使调试变得容易,可能会添加额外的日志记录(log)和测试(test)。其实,当使用 process.env.NODE_ENV === 'production' 时,一些 library 可能针对具体用户的环境进行代码优化,从而删除或添加一些重要代码。咱们可使用 webpack 内置的 DefinePlugin 为全部的依赖定义这个变量:
npm install cross-env -D "scripts": { "build": "cross-env NODE_ENV=production webpack --mode development", "dev": "webpack-dev-server --open --mode development " }, plugins: [ new webpack.DefinePlugin({ NODE_ENV:JSON.stringify(process.env.NODE_ENV) }), if (process.env.NODE_ENV == 'development') { console.log('这是开发环境'); } else { console.log('这是生产环境'); }
做者:正儿八经的娇娇 连接:https://juejin.im/post/5af8fa806fb9a07ac162876d 来源:掘金 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处