深入学习webpack
webpack配置是标准的Node.js CommonJS模块,webpack中的绝对路径指"/src/css/file",相对路径指"../css/file"。
温馨提示:本篇文章立足于3.5.x版本。
一、入口,entry
entry值可以是字符串,数组,对象。
//写法1是写法2的简写 const config = { entry: './src/file1.js' }; //写法2 const config = { entry: { main: './src/file1.js' } }; const config = { entry: ['./src/file1.js','./src/file2.js'] }; const config = { entry: { main: './src/file1.js', app: './src/file2.js' } };
二、输出,output
const config = { output: { filename: 'bundle.js', path: '/dist' } };
webpack有多种占位符,常见的如下:
[name]:代表打包后文件的名称,在entry或代码中确定;
[id]:webpack给块分配的内部chunk id,如果你没有隐藏,可以在打包后的命令行中看到;
[hash]:每次构建过程中,生成的唯一hash值;
[chunkhash]:依据于打包生成文件内容的hash值,内容不变,值不变。
三、模块,Modules
webpack模块有以下几种方式表达依赖关系:
1、ES2015 import;
2、同步,CommonJS require;
3、异步,AMD define和require语句;
4、css/less/sass中的@import;
5、样式中的url(...)和html文件中的<img src="..."/>。
loader是运行在Node.js中的函数,可以将资源文件作为参数,返回新的资源文件。loader用于加载某些资源文件,因为webpack本身只能打包CommonJS规范的js文件,对于其他资源,例如css,图片等,是没有办法加载的,这就需要对应的loader将资源转换。
1、babel-loader
加载ES2015+代码,然后使用Babel转译为ES5。
// npm一次性安装多个依赖模块,模块之间用空格隔开 npm install --save-dev babel-core babel-loader babel-preset-es2015
npm install --save-dev babel-loader babel-core babel-preset-env webpack
//单独配置.babelrc文件 module: { rules: [ { test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', options: { presets: ['env'], plugins: [require('babel-plugin-transform-object-rest-spread')] } } } ] }
2、css-loader
解析css文件后,使用import加载,并且返回css代码。
npm install --save-dev css-loader
import css from 'file.css';
module: { rules: [ { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] } ] }
3、style-loader
将模块的导出作为样式添加到DOM中。
npm install style-loader --save-dev
import style from './file.css';
module: { rules: [ { test: /\.css$/, use: [ { loader: "style-loader" }, { loader: "css-loader" } ] } ] }
4、sass-loader
加载sass文件。
#安装sass-loader npm i -D node-sass sass-loader css-loader
//webpack.config.js module.exports={ module:{ rules:[ { test:/\.scss$/, use:[ "style-loader", "css-loader", "sass-loader" ] } ] } }
//index.js,自动编译成css require "./main.scss"
5、postcss-loader
使用postcss加载和转译css/sss文件。
npm i -D postcss-loader
//postcss.config.js module.exports = { parser: 'sugarss', plugins: { 'postcss-import': {}, 'postcss-cssnext': {}, 'autoprefixer': {}, 'cssnano': {} } }
//webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, use: [ 'style-loader', { loader: 'css-loader', options: { importLoaders: 1 } }, 'postcss-loader' ] } ] } }
6、url-loader
像file loader一样工作,但如果文件小于限制,可以返回data URL。
npm install --save-dev url-loader
import img from './image.png';
module: { rules: [ { test: /\.(png|jpg|gif)$/, use: [ { loader: 'url-loader', options: { limit: 8192 } } ] } ] }
7、file-loader
将文件发送到输出文件夹,并返回(相对)URL。
npm install --save-dev file-loader
import img from './file.png';
module: { rules: [ { test: /\.(png|jpg|gif)$/, use: [ { loader: 'file-loader', options: { name: '[path][name].[ext]?[hash]' } } ] } ] }
8、html-loader
导出html为字符串,需要引用静态资源。
npm i -D html-loader
module: { rules: [{ test: /\.html$/, use: [ { loader: 'html-loader', options: { minimize: true } }] }] }
五、插件,plugins
webpack插件是一个具有apply属性的JavaScript对象,apply属性会被webpackcompiler调用,并且compiler对象可在整个compilation生命周期访问。plugin用于扩展webpack的功能,直接作用于webpack。
1、内置插件
A、BannerPlugin
为每个chunk文件头部添加注释信息。
new webpack.BannerPlugin(str)
B、CommonsChunkPlugin
它从根本上允许我们从不同的bundle中提取所有的公共模块,并且将他们加入公共bundle中。如果公共bundle不存在,那么它将会创建一个出来。
如果有任意模块加载了两次或更多(通过minChunks设置该值),它就会被打包进一个叫commons.js的文件里,后面你就可以在客户端缓存这个文件了。当然,这肯定会造成一次额外的请求,但是却避免了客户端多次下载相同库的问题。这个带来速度上的提升,因为浏览器会迅速将公共的代码从缓存中取出来,而不是每次访问一个新页面时,再去加载一个更大的文件。
new webpack.optimize.CommonsChunkPlugin({ name: "manifest", minChunks: Infinity })
C、DefinePlugin
创建一个在编译时可配置的全局常量,如果你自定义了一个全局变量PRODUCTION,可在此设置其值来区分开发还是生产环境,是启动dev server或者是prod server。
new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') // or development })
D、EnvironmentPlugin
实际上是DefinePlugin插件中对process.env进行设置的简写形式,如new webpack.EnvironmentPlugin(['NODE_ENV', 'DEBUG']) 将设置process.env.NODE_ENV='DEBUG'
E、UglifyJsPlugin
压缩JS代码。
const webpack = require('webpack'); module.exports = { plugins:[ new webpack.optimize.UglifyJsPlugin({ sourceMap: options.devtool && (options.devtool.indexOf("sourcemap") >= 0 || options.devtool.indexOf("source-map") >= 0) }) ] }
F、UglifyjsWebpackPlugin
npm i -D uglifyjs-webpack-plugin
const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); module.exports = { plugins: [ new UglifyJSPlugin() ] }
G、HotModuleReplacementPlugin
启用热替换模块(Hot Module Replacement),也被称为HMR,永远不要在生产环境(production)下启用HMR。
new webpack.HotModuleReplacementPlugin()
H、ProvidePlugin
自动加载模块,不要import或者require引入。
new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' })
2、非内置插件
A、ExtractTextWebpackPlugin
代码拆分,分离css和js文件。它将所有的入口chunk中引用的 *.css,移动到独立分离的css文件,使得样式不再内嵌到jsbundle中,而是会放到一个单独的css文件(即styles.css)当中。如果你的样式文件大小较大,这会做更快提前加载,因为css bundle会跟js bundle并行加载。
npm install --save-dev extract-text-webpack-plugin
const ExtractTextPlugin = require("extract-text-webpack-plugin"); module.exports = { module: { rules: [ { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: "css-loader" }) } ] }, plugins: [ new ExtractTextPlugin("styles.css") ] }
B、HtmlWebpackPlugin
这个插件的作用是依据一个简单的index.html模板,生成一个自动引用你打包后的JS文件的新index.html,在每次生成的js文件名称不同时非常有用(比如添加了hash值)。
npm install --save-dev html-webpack-plugin
var HtmlWebpackPlugin = require('html-webpack-plugin'); var webpackConfig = { entry: 'index.js', output: { path: 'dist', filename: 'index_bundle.js' }, plugins: [new HtmlWebpackPlugin()] };module.exports = webpackConfig;
C、CompressionWebpackPlugin
使用配置的算法(如gzip)压缩打包生成的文件。
npm i -D compression-webpack-plugin
var CompressionPlugin = require("compression-webpack-plugin"); module.exports = { plugins: [ new CompressionPlugin({ asset: "[path].gz[query]", algorithm: "gzip", test: /\.(js|html)$/, threshold: 10240, minRatio: 0.8 }) ] }
D、visualizer和stats
const StatsWriterPlugin = require('webpack-stats-plugin').StatsWriterPlugin; const Visualizer = require('webpack-visualizer-plugin'); module.exports = { ... plugins: [ new StatsWriterPlugin({ fields: null, stats: { chunkModules: true } }), new Visualizer({ filename: './statistics.html' }), ... ] }
六、devtool
// 以牺牲构建速度为代价,但是map表最详细。 devtool: "source-map" // 嵌入到源文件中,为打包前的每一个文件添加sourcemap的DataUrl,DataUrl是包含一个文件完整souremap信息的Base64格式化后的字符串,而不是一个 url。 devtool: "inline-source-map" // 没有模块映射,而是命名模块,以牺牲细节达到最快。 devtool: "eval" // 将SourceMap嵌入到每个模块中 devtool: "eval-source-map" // SourceMap不在源文件中引用 devtool: "hidden-source-map" //没有模块映射 devtool: "cheap-source-map" //有模块映射 devtool: "cheap-module-source-map"
当webpack打包源代码时,可能会很难追踪到错误和警告在源代码中的原始位置。JavaScript提供了source map功能,将编译后的代码映射回源代码,使调试更容易。如果一个错误来自于b.js,source map就会明确的告诉你。
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); module.exports = { entry: { app: './src/main.js', print: './src/sec.js' }, + devtool: 'inline-source-map', plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'Development' }) ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') } };
假设在sec.js中写一个错误语法,编译打包后,刷新页面,就会在控制台看到错误文件及出错行数。
七、devServer
用于设置webpack-dev-server的命令行。
devServer: { bonjour:true, contentBase: path.join(__dirname, "dist"), compress: true, historyApiFallback: true, hot: true, inline: true, open:true }
看了那么多文档,一般都是清一色的英文,这次竟然发现devServer的属性值中有bonjour,哈哈,挺好的,我猜写webpack的开发人员会点法语。
//webpack.config.js const path = require('path'); module.exports = { entry:"", output: { path: path.resolve(__dirname, "dist"), //路径解析 filename: "bundle.js" }, module: { rules: [] }, plugins: [], devtool: "inline-source-map", devServer: { contentBase: "./public", //本地服务器所加载的页面所在的目录 historyApiFallback: true, //不跳转 inline: true, //实时刷新 stats:{} }, target:"web", externals: { vue: 'vue' }, performance: { hints: "error" //生产环境推荐用error,开发环境推荐用warning } }
深入学习webpack的更多相关文章
- [译]开始学习webpack
写在前面: 文章翻译自petehunt大神的petehunt/webpack-howto,作为学习webpack的开始.fork了一份,翻译后的在这里https://github.com/zjzhom ...
- 深入学习webpack(一)
深入学习webpack(一) 模块化的相关库和工具已经很多了,包括require.js.sea.js和一些工程化工具webpack.gulp.grant.那么我们该如何选择呢? 其实,我们只需要掌握了 ...
- webpack4 学习 --- webpack和webpack-dev-server
以前了解过webpack2, 所以对webpack 不是很陌生,就直接入主题吧.新建一个文件夹,就叫它webpack-tut吧.然后在文件中新建一个src 文件夹,存放我们的源文件,再在src 文件夹 ...
- 如何学习 Webpack
webpack-howto Tip: 本文是 webpack-howto 的原文,我觉得这篇文章写得非常好,确实算是目前学习 webpack 入门的必读文章.直接收录之. 本教程的目标 这是一本教你如 ...
- 深入学习webpack(二)
深入学习webpack(二) 在深入学习webpack(一)中,我通过一个例子介绍了webpack的基本使用方法,下面将更为系统的学习webpack的基本概念,对于一门技术的掌握我认为系统化还是很重要 ...
- 跟我一起学习webpack使用配置文件(二)
接着跟我一起学习webpack(一)中的项目来,我们接下来使用配置文件 使用npx webpack -h 我们可以查看webpack的配置参数 从我们在package.json中添加的命令来看,当项目 ...
- 学习webpack基础笔记01
学习webpack基础笔记 1.webpack搭建环境最重要的就是如何使用loader和plugins,使用yarn/npm安装插件.预处理器,正确的配置好去使用 2.从0配置webpack - 1. ...
- vue第二单元(webpack的配置-学习webpack的常用配置)
第二单元(webpack的配置-学习webpack的常用配置) #课程目标 掌握webpack的常用配置 掌握如何根据实际的需求修改webpack的对应配置 了解webpack-dev-server的 ...
- 零基础学习webpack打包管理
这些天在项目之余的时间学习了webpack打包项目的东西,非常荣幸的找到一些大神的文章来学习,死劲嚼了几天,终于略知一二.在以后的工作上还需继续学习,下面我将分享我这几天学到的一点东西,希望能让我一个 ...
- Webpack学习-Webpack初识
一.前言 webpack 到底是个什么东西呢,看了一大堆的文档,没一个能看懂的,因为上来就是给个module.exports 然后列一大堆配置,这个干啥,那个干啥,没一点用.但凡要用一个东西,一个东西 ...
随机推荐
- nginx入门三
负载均衡 upstream upstream app_server { server 127.0.0.1:8000; server 192.168.2.134:80; server 47.xx.xx. ...
- L0/L1/L2范数(转载)
一.首先说一下范数的概念: 向量的范数可以简单形象的理解为向量的长度,或者向量到零点的距离,或者相应的两个点之间的距离. 向量的范数定义:向量的范数是一个函数||x||,满足非负性||x|| > ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器
1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...
- Expm 1_1 实现基于分治法的归并排序算法.
package org.xiu68.exp.exp1; public class Exp1_1 { public static void main(String[] args) { // TODO A ...
- 配置Sublime Text2的python运行环境(Sublime Text 3也类似)
1. 前言 用Sublime Text 2 配置Python运用环境,有简单配置还有像IDLE一样的配置,本文分成第一部分和第二部分. 2. 配置 第一部分(简单配置) 1.只需要打开Pref ...
- 统一异常处理@ExceptionHandler
异常处理功能中用到的注解是:@ExceptionHandler(异常类型.class). 这个注解的功能是:自动捕获controller层出现的指定类型异常,并对该异常进行相应的异常处理. 比如我要在 ...
- DNS详解: A记录,子域名,CNAME别名,PTR,MX,TXT,SRV,TTL
DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务).域名系统为Internet上的主机分配域名地址和IP地址.由于网络中的计算机都必 ...
- css之absolute
一.absolute和float有相同的特性,包裹性和破坏性 1.absolute和float的相似(看下面的demo,如果图片在左上角,那么用float和absolute都一样) <!doct ...
- 【转载】linux下升级npm以及node
原文:http://blog.csdn.net/qq_16339527/article/details/73008708 npm升级 废话不多说,直接讲步骤.先从容易的开始,升级npm. npm这款包 ...
- 查看Java JVM参数配置信息命令
查看Java JVM参数配置信息命令 java -XX:+PrintCommandLineFlags jvm运行时状态的参数,可以很快找出问题所在.现在把几个命令记录一下:1. jstat这个命令对于 ...