webpack核心提炼
基本是学习的时候在网上整理的资料,并非自己原创,这篇文章的的主要目的是记录webpack.config.js的配置方式.可能也有不少错误,欢迎指正!!
一、应用场景
前端模块化开发、功能拓展、css预处理等需求导致项目中的文件数目变得更多,层级也更复杂.
二、主要职能
webpack的工作主要是打包,分为三个环节:匹配、处理、打包.
三、配置文件-webpack.config.js
在项目的根目录新建一个webpack.config.js文件告诉webpack该做的事.
module.exports={
//入口文件的配置项
entry:{},
//出口文件的配置项
output:{},
//解读CSS,图片如何转换,压缩等配置
module:{},
//项目依赖
plugins:[],
//配置webpack开发服务功能
devServer:{}
}
四、配置项分析
1.entry-入口项配置.
我们需要压缩的文件,比如js、css、less文件等
entry:{
//里面的entery是可以随便写的
entry:'./src/entry.js'
},
2.output-出口项配置
压缩完成后文件名和地址
(1)._dirname:node中path对象的一个属性,获取当前文件的绝对路径.打包路径表示需要最终把打包好的文件生成在哪里,所以需要根据webpack.config.js的绝对位置来判断.为了不写死,我们需要动态获取绝对位置,就有用到这一属性
(2)path.resolve('a','b'):path对象的一个方法,将两个字符串拼接成一个新路径(自带一些优化功能,不仅仅是字符串拼接).
(3)path:以上两个都要依赖于path模块,所以要先通过require('path')导入path模块.
const path = require('path');
output:{
//打包的路径
path:path.resolve(__dirname,'dist'),
//打包的文件名称
filename:'bundle.js'
}
整个过程的意义就是,告诉webpack,我要你把入口配置好的所以文件给我压缩成名叫"bundle.js"的文件,放在路径"path"处
3.多入口、多出口文件打包
const path = require('path');
module.exports={
entry:{
//为了区别不同的入口,需要不同的属性名
entry:'./src/entry.js',
//这里我们又引入了一个入口文件
entry2:'./src/entry2.js'
},
output:{
path:path.resolve(__dirname,'dist'),
//输出的文件名称,[name]会自动获取入口文件中的文件名,不同的文件就能拿到不同的文件名
filename:`[name].js`
},
module:{},
plugins:[],
devServer:{}
}
4.同时压缩js文件和css文件
先下载处理器
npm install --save -dev css-loader style-loader sass-loader less-loader postcss-loader
const path = require('path');
module.exports={
entry:{
//入口文件并没有css文件?可以在entry.js中引入css文件,方便webpack进行同步压缩
entry:'./src/entry.js',
entry2:'./src/entry2.js'
},
output:{
path:path.resolve(__dirname,'dist'),
filename:`[name].js`
},
//webpack能识别css文件,但是你必须得告诉它我这里有css文件,所以在这里你要告诉它哪些文件是css文件
module:{
//它表示哪种类型的文件用哪种处理器(处理器?原来有吗?没有!所以需要下载,需要执行下载的语法)
rules:[
//匹配到.css结尾的文件,就先调用对应的处理器
{test: /\.css$/, loader: "style!css?sourceMap!postcss"},
{test: /\.less$/, loader: "style!css!less|postcss"},
{test: /\.scss$/, loader: "style!css!sass|postcss"}
]
]
},
plugins:[],
devServer:{}
}
还有其他的处理器,根据需求下载和匹配
- css-loader 处理css中路径引用等问题
- style-loader 动态把样式写入css
- sass-loader scss编译器
- less-loader less编译器
- postcss-loader scss再处理
- babel-loader js处理器这里需要配置(
exclude) - jsx-loader
- url-loader
- file-loader
- json-loader
- raw-loader
4.plugins-插件依赖
想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。
多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 来创建它的一个实例。
先下载处理器
npm install --save -dev css-loader style-loader sass-loader less-loader postcss-loader
const path = require('path');
//导入需要的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
module.exports={
entry:{
entry:'./src/entry.js',
entry2:'./src/entry2.js'
},
output:{
path:path.resolve(__dirname,'dist'), filename:`[name].js`
},
module:{
rules:[
{test: /\.css$/, loader: "style!css?sourceMap!postcss"},
{test: /\.less$/, loader: "style!css!less|postcss"},
{test: /\.scss$/, loader: "style!css!sass|postcss"}
]
},
plugins:[
//打包js文件
new webpack.optimize.UglifyJsPlugin(),
//entry.html未模板生成一个html5文件
new HtmlWebpackPlugin({template:'./src/entry.html'})
],
devServer:{}
}
5.devServer-虚拟服务器
- 在开发模式下,DevServer 提供虚拟服务器,让我们进行开发和调试。
- 而且提供实时重新加载。简直美滋滋。大大减少开发时间。
- 它不是 webpack 内置插件哦,要安装!!!
先下载处理器
npm install --save -dev css-loader style-loader sass-loader less-loader postcss-loader安装server插件
npm install webpack-dev-server --save-dev
const path = require('path');
//导入需要的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
module.exports={
entry:{
entry:'./src/entry.js',
entry2:'./src/entry2.js'
},
output:{
path:path.resolve(__dirname,'dist'), filename:`[name].js`
},
module:{
rules:[
{test: /\.css$/, loader: "style!css?sourceMap!postcss"},
{test: /\.less$/, loader: "style!css!less|postcss"},
{test: /\.scss$/, loader: "style!css!sass|postcss"}
]
},
plugins:[
//打包js文件
new webpack.optimize.UglifyJsPlugin(),
//entry.html未模板生成一个html5文件
new HtmlWebpackPlugin({template:'./src/entry.html'})
],
//这里只列出部分参数,还有许多参数
devServer: {
//如果为 true ,页面出错不会弹出 404 页面。如果为 {...} , 看看一般里面有什么。
historyApiFallback: true,
//热模块更新作用。即修改或模块后,保存会自动更新,页面不用刷新呈现最新的效果(实际功能是自动添加HMR这个插件)
hot: true,
//如果为 true ,开启虚拟服务器时,为你的代码进行压缩。加快开发流程和优化的作用。
compress: true,
//写主机名的。默认 localhost
host: 'localhost',
//端口号。默认 8080
port: 8080
}
五.本地服务器
在 package.json 配置下,方便使用
"scripts": {
"dev": "webpack-dev-server" // 运行命令会自动在node_modules文件夹找 webapck-dev-server模块。"dev"就是你命令中run后面的词,你也可以换成"server"等词,不过对应的命令就得换成"npm run server"等
}
如果没在 package.json 配置且还是局部安装,你就要在命令行输入 node_modules/.bin/webpack-dev-server。若你 package.json 配置好了,在命令行输入npm run dev
webpack核心提炼的更多相关文章
- 前端进阶必读:《JavaScript核心技术开发解密》核心提炼二
前言 最近读勒基本关于前端的数据<JavaScript核心技术开发解密>,<webpack从入门到进阶>...这几本书帮助到我更好的理解JS.webpack在前端技术领域中的作 ...
- Webpack 核心开发者 Sean Larkin 盛赞 Vue
dev.io 近日邀请了 Webpack 核心开发者 Sean Larkin 回答开发者提问,其中几个问提比较有意思,和掘金的小伙伴们分享一下. 先上点前菜: 有一个开发者问 Sean 如何成为一个热 ...
- 手写webpack核心原理,再也不怕面试官问我webpack原理
手写webpack核心原理 目录 手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6 ...
- webpack核心模块tapable源码解析
上一篇文章我写了tapable的基本用法,我们知道他是一个增强版版的发布订阅模式,本文想来学习下他的源码.tapable的源码我读了一下,发现他的抽象程度比较高,直接扎进去反而会让人云里雾里的,所以本 ...
- webpack核心概念
一.webpack四个核心概念 1.入口[Entry] webpack将创建所有应用程序 依赖关系图表.图表的起点被称之为 入口起点.入口起点告诉webpack从哪里开始,并遵循着依赖关系图表知道打包 ...
- Webpack 核心模块 tapable 解析(转)
原文出自:https://www.pandashen.com 前言 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器,是对前端项目实现自动化和优化必不可少的工具,We ...
- webpack核心模块tapable用法解析
前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...
- webpack(2)webpack核心概念
前言 本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具.当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph) ...
- webpack--初试webpack( 核心、体验、资源打包)
前言 webpack是当前前端项目中最常用的资源构建工具,从本文开始,来总结记录一下关于webpack的学习. 正文 1.webpack简介 webpack官网(https://webpack.doc ...
随机推荐
- [cogs396] [网络流24题#4] 魔术球 [网络流,最大流,最小路径覆盖]
本题枚举每多一个球需要多少个柱子,可以边加边边计算,每次只需要判断$i-Dinic()$即可:特别注意边界. #include <iostream> #include <algori ...
- spring boot开发REST接口
1.配置pom.xml文件的<parent>和<depencencies>,指定spring boot web依赖 <parent> <groupId> ...
- [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
- 使用Java VisualVM配置Java应用程序/分析CPU或内存的使用情况(转)
以下内容翻译自(机翻):https://baptiste-wicht.com/posts/2010/07/profile-applications-java-visualvm.html 当您需要发现应 ...
- hive 报错/tmp/hive on HDFS should be writable. Current permissions are: rwx--x--x
启动hive时报例如以下错误:/tmp/hive on HDFS should be writable. Current permissions are: rwx--x--x 这是/tmp/hive文 ...
- Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item
本文为原创博客.出自http://blog.csdn.net/minimicall 到今天为止,搜芽的卖家版本号应该来说已经基本完毕.攻坚克难的一路过来.速度也控制的比較好. 项目过程进度 从任务分配 ...
- uiautomator +python 安卓UI自动化尝试
使用方法基本说明:https://www.cnblogs.com/mliangchen/p/5114149.html,https://blog.csdn.net/Eugene_3972/article ...
- 成都传智播客java就业班激情洋溢的青春篮球赛
为了缓解学员们的学习压力,也为了培养学员们的团队协作精神,5月28日下午,在班主任倪老师和王老师联手带领下,我们1406280ls" style="color:rgb(51,102 ...
- Lucene5学习之使用MMSeg4j分词器
分类:程序语言|标签:C|日期: 2015-05-01 02:00:24 MMSeg4j是一款中文分词器,详细介绍如下: 1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法( ...
- 线段树 hdu3255 Farming
做了这么多扫描线的题,,基本都是一个思路. 改来改去,,无非就是维护的节点的内容以及push_up越写越复杂了而已 首先将价格排序处理一下编号,变成编号越大的powerfol越大 然后后面加入扫描线的 ...