当前位置: 首页 > 编程日记 > 正文

webpack 大法好 ---- 基础概念与配置(1)

再一次见面!

Light 还是太太太懒了,距离上一篇没啥营养的文章已经过去好多天。今天为大家介绍介绍 webpack 最基本的概念,以及简单的配置,让你能快速得搭建一个可用的 webpack 开发环境。


webpack的安装

webpack 运行于 node 环境,node 的安装在这就不赘述了。由于 Light 是基于 webpack2 为大家介绍的,因此 node 的版本尽量要新(文章本就是很基础的东西,想必看文章的人也是刚接触 webpack,粗暴点,直接去装最新版)。至于 webpack 的安装大体上可以分为两种。一是安装在项目目录下,二是全局安装。

项目下安装

来,新建个文件夹,运行命令:

npm install webpack --save-dev

静静等待安装完成(要是使用 npm 安装缓慢或者失败,可以使用 npm 镜像 cnpm 代替,具体问度娘)。至此,你的项目下已经可以使用 webpack 了。不信?你命令行里敲个 webpack 试试!

.........敲敲敲.........

what fuck!command not found!

当然了!想直接运行 webpack 命令,你需要将 webpack 添加到系统变量啊。这就是马上要说的 webpack 全局安装了。

全局安装

相同的,运行命令:

npm install webpack -g

..........耐心等待........

安装完成后,你的系统变量里就存在 webpack 命令了,你可以运行下试试。

.........敲敲敲.........

what fuck again!又是错误提示!

No configuration file found and no output filename configured via CLI option.
A configuration file could be named 'webpack.config.js' in the current directory.

四级都过了吧!意思是说你没有配置文件啊!是的,webpack 运行时候,会第一时间去找当前目录下属于它的配置文件,我们要是啥都不给它,它也不懂怎么输出文件啊。

最最最简单的配置

不跟你客套了,直接上代码:

var path = require('path');
module.exports = {entry: {index:'./src/index.js',},output: {//path 是 nodeJS 的一个基础模块,这里用来获取绝对路径path: path.resolve(__dirname, 'dist'),filename: 'bundle.js'}
}

对了,配置信息请写在项目目录下的 webpack.config.js 文件里,这是 webpack 默认状态下使用的配置文件。
好了,看代码,顾名思义, entry 选项的意思就是入口文件!作用就是告诉 webpack ,我这整个项目就是从这个 index.js 文件开始的,你也从这个文件进来看我都写了什么高大上的代码。大家都知道, webpack 是用来打包的,那既然有 entry 入口,便也有 output 出口了。以上关于 output 的配置是告诉 webpack,把打包好的文件放在 当前目录下的 dist 文件夹里,而且文件名叫做 bundle.js 。
此时你去命令行里敲下 webpack ,是不是发现项目目录下多了一个 dist 文件夹?是的话,那么恭喜你,你已经成功得使用 webpack 打包了你的项目。
到此,你应该已经大致理解了 webpack 的运行方式,它通过配置读取了入口文件,然后根据入口文件的代码,调用你项目中运用到的依赖模块,并最终将所有的模块打包并输出出来。简单的原理理解就是这样,可是这还是皮毛啊,你要不是看 Light 的文章,去看别人的教程,或者官方文档,我相信这些你三四分钟就掌握了。

webpack 是根据你提供的代码去搞一些事情,也就是说,它只看得懂你写的 js 啊。它并不懂你写的 css、scss、ts...等等非 JS 文件,然而 webpack 很诚恳得把每个文件都作为模块,你要是用到了,它就会帮你去打包,至于对错,它真的不 care 。
那么其他的非 JS 文件,webpack 要怎么去解析呢?接下来就是 webpack 的另一个重要概念:Loaders。

Loaders 加载器

Loader--加载器,既然叫这个名字,能干嘛还不知道么?加载文件时候都要经过它的层层把关,换句话说,它就是帮 webpack 看门的。项目中你可能用到各种各样的模块,各种各样的文件,每一个文件都会经过这个 Loader,而它会根据你提供的配置,根据要加载的文件后缀,调用相关的加载器去加载文件。接下来举一个栗子,如何在你的项目中使用 ES6 。

关注前端发展的同学都知晓,ES6 作为新一代的 js 标准,越来越受到开发者们的关注,也越来越多的人使用 ES6 去开发项目。然而,理想很丰满,浏览器兼容这个现实难题也相当饱满。市场上的浏览器大佬们,并非都完美支持 ES6 ,也就是说你拿 ES6 的代码是交不了差的。可是时代潮流不能被这些大佬给克制住了啊,于是,万能的社区为我们提供了 Babel 这一神器。它可以将 ES6 语法转化为 ES5 ,从而解决我们的后顾之忧,可以大胆得使用 ES6。
关于 ES6 的介绍,推荐大家去看阮一峰老师的ECMAScript 6 入门,对于刚接触的人来说是很有帮助的。

webpack里,如何使用 ES6?答案就是 Loader。
首先安装 babel:

npm install --save-dev babel-loader babel-core babel-preset-es2015

接着就是去告诉 webpack ,你有 Loader 的。还是 webpack.config.js 。

var path = require('path');
module.exports = {entry: {index:'./src/index.js',},output: {//path 是 nodeJS 的一个基础模块,这里用来获取绝对路径path: path.resolve(__dirname, 'dist'),filename: 'bundle.js'},module: {loaders: [{ test: /\.js$/,exclude: /node_modules/,loader: "babel-loader" }]}
}

通过以上配置,当 webpack 中需要打包 JS 文件时,就会去调用 babel-loader 来进行解析(webpack1 的时候可以写 loader: "babel",2.0的版本开始,必须写 "babel-loader")。从而,你用 ES6 语法来写,输出的文件会被转为 ES5。当然,想要正确使用 babel,你还需要对 babel 进行配置。很简单,在项目目录下新建一个 .babelrc 文件,里头写 JSON 格式的配置信息。

{"presets": ["es2015"]
}

除了 JS 文件,其他文件类型,例如 css、scss、jpg、ts、vue......等等,都有相应的 Loader 。需要用的时候就配置相应的加载器即可。前端是个五彩缤纷的世界,生存的王道就是要学会适应变化。下面就简单列举一些常用 Loader。

loaders: [{ test: /\.js$/,exclude: /node_modules/,loader: "babel-loader" },{test: /\.css$/, loader: "style-loader!css-loader!postcss-loader"},{test: /\.(png|jpg|gif|svg)$/,loader: 'url-loader?limit=2048'}
]

上诉如果有不懂的,欢迎留言。介绍完 Loaders ,接下来介绍 webpack 另外一个重要概念:Plugins

Plugins 插件

plugin的目的其实就是填补 loader 的不足。当然,它也是 webpack 功能可配置化的基础。先看代码:

  plugins:[//代码压缩new webpack.optimize.UglifyJsPlugin({compress: {warnings: false,drop_console: true,drop_debugger: true}})]

这里我们使用了 webpack 自带的代码压缩插件。可以注意到,由于可以给插件传入参数,因此插件的调用需要用 new 来声明。此时运行 webpack,最终打包出来的代码是压缩好的。Light 能力有限,至于如何自己去写 webpack 插件,在这就不聊了!我也不会啊!

下面是完整的配置文件:

var path = require('path');
var webpack = require('webpack');
module.exports = {entry: {index:'./src/index.js',},output: {path: path.resolve(__dirname, 'dist'),filename: 'bundle.js'},module: {loaders:[{test: /\.css$/, loader: "style-loader!css-loader!postcss-loader"},{test: /\.(png|jpg|gif|svg)$/,loader: 'url-loader?limit=2048'},{test: /\.js$/,exclude: /node_modules/, loader: "babel-loader" }]},plugins:[//代码压缩new webpack.optimize.UglifyJsPlugin({compress: {warnings: false,drop_console: true,drop_debugger: true}})]
}

也可以访问 git 来获取这个最简单的 webpack 开发环境:https://github.com/rcg1994/we...

ok!今天到此为止,如果你正好看到这篇文章,又正好看到这句话,那咱就交个朋友吧。有任何问题都可以在文末留言,或者加我微信。一起交流才能进步。下次谈谈 webpack 热更新或者其他能想到的。最后献上个人微信号:

微信号:rcgrcg

相关文章:

Zookeeper迁移(扩容/缩容)

zookeeper选举原理在迁移前有必要了解zookeeper的选举原理,以便更科学的迁移。快速选举FastLeaderElectionzookeeper默认使用快速选举,在此重点了解快速选举:向集群中的其他zookeeper建立连接,并且只有myid比对方大的连接才会被接…

SVO Without ROS环境搭建

Installation: Plain CMake (No ROS) 首先,建立工作目录:workspace,然后把下面的需要的都在该目录下进行. mkdir workspace cd workspace Boost - c Librairies (thread and system are needed) sudo apt-get install libboost-all-dev Eige…

BackgroundSubtractorGMG 背景建模

#include <opencv2/bgsegm.hpp> #include <opencv2/video.hpp> #include <opencv2/opencv.hpp> #include <iostream> #include <sstream> using namespace cv; using namespace std; using namespace bgsegm; // GMG目标建模检测 void detectBac…

启动webpack-dev-server只能本机访问的解决办法

修改package.json的dev启动设置&#xff0c;增加--host 0.0.0.0启动后localhost更换为本机IP即可访问

TCP/IP:IP选项处理

引言 IP输入函数要对IP 进行选项处理&#xff0c;。RFC791和1122规定了IP选项和处理规则。一个IP首部可以跟40个字节的选项。 选项格式 选项的格式&#xff0c;分为两种类型&#xff0c;单字节和多字节。 ip_dooptions函数 这个函数用于判断分组转发。用常量位移访问IP选项字段…

【SVO2.0 安装编译】Ubuntu 20.04 + Noetic

ways one 链接: https://pan.baidu.com/s/1ZAkeD64wjFsDHfpCm1CB1w 提取码: kxx2 (downloads and use idirectly) ways two: [SVO2-OPEN: https://github.com/uzh-rpg/rpg_svo_pro_open](https://github.com/DEARsunshine/rpg_svo_pro_open)git挂梯子 如果各位终端无法挂梯…

人眼目标检测初始化

// 初始化摄像头读取视频流cv::VideoCapture cap(0);// 宽高设置为320*256cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);cap.set(CV_CAP_PROP_FRAME_HEIGHT, 256);// 读取级联分类器// 文件存放在opencv\sources\data\haarcascades bool flagGlasses false;if(flagGlasses){face_ca…

Qt之界面换肤

简述 常用的软件基本都有换肤功能&#xff0c;例如&#xff1a;QQ、360、迅雷等。换肤其实很简单&#xff0c;并没有想象中那么难&#xff0c;利用前面分享过的QSS系列文章&#xff0c;沃我们完全可以实现各种样式的定制&#xff01; 简述实现原理效果新建QSS文件编写QSS代码加…

mongDB的常用操作总结

目录 常用查询:查询一条数据查询子元素集合:image.idgte: 大于等于,lte小于等于...查询字段不存在的数据not查询数量:常用更新更新第一条数据的一个字段:更新一条数据的多个字段:常用删除删除:常用查询: 查询一条数据 精确匹配is Query(Criteria.where("id").is(id))…

【GTSAM】GTSAM学习

1 what GTSAM ? GTSAM 是一个在机器人领域和计算机视觉领域用于平滑&#xff08;smoothing&#xff09;和建图&#xff08;mapping&#xff09;的C库。它与g2o不同的是&#xff0c;g2o采用稀疏矩阵的方式求解一个非线性优化问题&#xff0c;而GTSAM是采用因子图&#xff08;f…

人脸、人眼检测与跟踪

#include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv;CascadeClassifier face_cascade; CascadeClassifier eye_cascade;// 人眼检测 int detectEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) {std::v…

linux下jdk简单配置记录

记录哈&#xff0c;搭建环境的时候&#xff0c;copy使用方便。 vim /etc/profile export JAVA_HOME/usr/java/jdk1.7.0_79export PATH$JAVA_HOME/bin:$PATHexport CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JRE_HOME$JAVA_HOME/jreexport LANGzh_CN.UT…

Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案

关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案 转载于:https://www.cnblogs.com/daemonFlY/p/10916812.html

so库方法原理

动态库 So库&#xff0c;又动态名库&#xff0c;是Linux下最常见的文件之一&#xff0c;是一种ELF文件。这种so库是程序运行时&#xff0c;才会将这些需要的代码拷贝到对应的内存中。但程序运行时&#xff0c;这些地址早已经确定&#xff0c;那程序引用so库中的这些代码地址如…

上传图片,多图上传,预览功能,js原生无依赖

最近很好奇前端的文件上传功能&#xff0c;因为公司要求做一个支持图片预览的图片上传插件&#xff0c;所以自己搜了很多相关的插件&#xff0c;虽然功能很多&#xff0c;但有些地方不能根据公司的想法去修改&#xff0c;而且需要依赖jQuery或Bootstrap库&#xff0c;所以我就想…

springboot 简单自定义starter - beetl

使用idea新建springboot项目beetl-spring-boot-starter 首先添加pom依赖 packaging要设置为jar不能设置为pom<packaging>jar</packaging> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web&…

cmake生成so包并调用(C++project,build,cmake)

1. 目录结构 2 . downloads 2.1 build module process CMakeLists.txt > cmake_minimum_required(VERSION 3.5)if(CMAKE_COMPILER_IS_GNUCC)message("COMPILER IS GNUCC")ADD_DEFINITIONS ( -stdc11 ) endif(CMAKE_COMPILER_IS_GNUCC)SET(CMAKE_CXX_FLAGS_DEBU…

人眼模板匹配自动跟踪

void trackEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) {// 人眼位置cv::Size pSize(rect.width * 2, rect.height * 2);// 矩形区域cv::Rect tRect(rect pSize - cv::Point(pSize.width/2, pSize.height/2));tRect & cv::Rect(0, 0, im.cols, im.rows);…

前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序

『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题&#xff0c;一般都是比较基础但是容易遗忘的知识点&#xff0c;你也可能会在面试中碰到。 我会查阅一些资料并可能加上自己的理解&#xff0c;来记录这些问题。更多文章请前往我的个人博客这个问题是有关执行顺序和Eve…

bat 将war文件转换成ear文件

1、无需拷贝war文件&#xff0c;自动获取war set path%path%;D:\jdk\jdk1.6.0_31\bin;C:\Program Files\7-Zip del **0001-controller.war del **0001-controllerEAR.ear copy ..\target\**0001-controller-0.0.1-SNAPSHOT.war **0001-controller.war rem 7z d -tzip **0001-co…

cmake语法【一】

一、Cmake 简介 cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 二、常用命令 指定 cmake 的最小版本 cmake_minimum_required(VERSION 3.4.1)这行命令是可选的&#xff…

RHEL6.3安装vsftpd

1、下载vsftpd&#xff0c;可以从官网&#xff08;http://vsftpd.beasts.org&#xff09;下载&#xff0c;也可以百度搜索[rootlocalhost vsftpd]# wget http://down1.chinaunix.net/distfiles/vsftpd-3.0.2.tar.gz2、解压压缩包并进入解压出来的目录[rootlocalhost vsftpd]# t…

创建mysql数据库,在新数据库中创建表,再尝试删除表

创建之前&#xff0c;先登录数据库存 mysql -u 账号 -p密码 登录完成后&#xff0c;展示一下已存在的数据库 show databases; 创建数据库 create database test111; 然后展示一下数据库&#xff0c;如下 show databases; 使用数据库 use test; 在test数据库里面看一下已存在的…

cmake:在各级目录之间共享变量(cmake cache变量)

摘要: 本文记录一下 CMake 变量的定义、原理及其使用。CMake 变量包含 Normal Variables、Cache Variables。通过 set 指令可以设置两种不同的变量。也可以在 CMake 脚本中使用和设置环境变量。set(ENV{} …)&#xff0c;本文重点讲述 CMake 脚本语言特有的两种变量。 正文&am…

antd+dva笔记

参考 React中函数式声明组件Dva Ant Design 前后端分离之 React 应用实践ReactDvaJS 之 hook 路由权限控制dva 知识地图react-router Guides and API docs (v2, v3)react-sage redux-saga 是一个用于管理 Redux 应用异步操作,可以用来代替 redux-thunk 中间件。《Redux-saga 中…

求两个矩形重叠部分的面积

#include<stdio.h> #include<math.h>#define areaFile "area.txt" #define perportionFile "perportion.txt"#define min(a,b) ( ((a)>(b)) ? (b):(a) ) #define max(a,b) ( ((a)>(b)) ? (a):(b) )typedef struct xy { int x; int y; …

session,cookie,sessionStorage,localStorage的区别及应用场景

浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式&#xff0c;可以利用cookie,session等跟服务端进行数据交互。 一、cookie和session cookie和session都是用来跟踪浏览器用户身份的会话方式。 区别&#xff1a; 1、保持状态&#xff1a;cookie保存在浏览器端&#x…

鱼眼镜头及其标定

1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待&#xff0c;都是射影变换&#xff08;Perspective transform&#xff09;&#xff1b; 鱼眼镜头受到水下斯涅耳窗口现象的启发&#xff0c;采用不同的投影方式&#xff0c;来得到极大的视场角&#xff…

django -- url 的 name 属性

在html的form中使用给url定义的name值&#xff0c;可以在修改url时不用在修改form的src。 urls.py from django.conf.urls import url from mytest import viewsurlpatterns [# url(r^admin/, admin.site.urls),url(r^index/, views.index, namemysite), views.Index.as_view(…

两个矩形重叠部分面积

#include<stdio.h> #include<math.h> #define min(a,b) ( ((a)>(b)) ? (b):(a) ) #define max(a,b) ( ((a)>(b)) ? (a):(b) )typedef struct xy { int x; int y; }xy;void main() {xy a[4];int s,chang,kuang;while (true){printf("Please input 4 x,…