详解webpack模块加载器兼打包工具


Posted in Javascript onSeptember 11, 2018

 什么是 webpack?

webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。

我们可以直接使用 require(XXX) 的形式来引入各模块,即使它们可能需要经过编译(比如JSX和sass),但我们无须在上面花费太多心思,因为 webpack 有着各种健全的加载器(loader)在默默处理这些事情,这块我们后续会提到。

你可以不打算将其用在你的项目上,但没有理由不去掌握它,因为以近期 Github 上各大主流的(React相关)项目来说,它们仓库上所展示的示例已经是基于 webpack 来开发的,比如 React-Boostrap 和 Redux。

webpack的官网是 http://webpack.github.io/ ,文档地址是 http://webpack.github.io/docs/ ,想对其进行更详细了解的可以点进去瞧一瞧。

1>基本介绍

在webpack中,一个css甚至一个字体都成为模块,彼此存在依赖关系,webpack就是处理模块间依赖关系的,并将它们进行打包。

各种文件格式通过特定的加载器loader编译后,最终统一生成为.js,.css,.png,.jpg等静态资源。

但是归根到底他就是有个.js的配置文件,一个构架好或者差都表现在这个配置文件中。

2>配置webpack

创建一个目录demo,npm初始化

npm init//完成后有package.json文件

本地局部安装webpack

npm install webpack --save-dev

接着安装webpack-dev-server,可以在开发环境提供很多服务,比如启动一个服务器,热更新,接口代理

npm install webpack-dev-server --save-dev

写配置文件

在package.json中scripts里添加一个快速启动webpack-dev-server服务的脚本"dev":"webpack-dev-server --open --config webpack.config.js"

运行npm run dev的时候就会执行"webpack-dev-server --open --config webpack.config.js

其中config指向的是webpack-dev-server指向的文件路径。Open在执行时自动会在浏览器打开页面,默认地址是127.0.0.1:8080,不过ip,端口号都可以配置

3>webpack的四个核心概念:

入口(entry)、输出(output)、加载器(loader)、插件(plugins)

1》entry 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始,可以是单入口也可以是多入口

2》output 用来配置编译后的文件存储位置和文件名,只能有一个出口

  • output中有path选项用来存放打包后文件的输出目录,必填
  • filename用于指定输出文件的名称
  • publicePath指定文件引用的目录

3》loader 对模块源代码进行转换(webpack 本身只能处理Js模块)。

module:{
  rules:[
  {
   test:/\.css$/,
  use:[
    'style-loader',
    'css-loader'
  ]
  }
 ]
 }

在module对象的rules属性中可以指定一系列的loader,每一个loader都必须包括test,use两个选项。

上面代码的意思是:webpack编译过程中遇到require()或import语句导入一个后缀为.css的文件时,它将先通过css-loader转换,再通过style-loader转换,然后打包。

  • test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
  • use 属性,表示进行转换时,应该使用哪个 loader。可以是字符串或者数组,数组从后面开始编译。
const webpack = require('webpack'); //访问 webpack 运行时(runtime)
 const configuration = require('./webpack.config.js');
 let compiler = webpack(configuration);
 compiler.apply(new webpack.ProgressPlugin());
 compiler.run(function(err, stats) {
 // ...
 });

4》Plugins:可以用来解决loader无法实现的其他事。外置插件要先npm安装,然后导入插件用require()

extract-text-webpack-plugin插件可以把散落在各地的Css提取出来,并合成一个文件.

//导入插件
var ExtractTextPlugin=require('extract-text-webpack-plugin');
var config={
//...
 plugins:[
 //重命名提取后的css
 new ExtractTextPlugin('main.css')
 ]
};

webpack的优点如下:

1. webpack 遵循commonJS 的形式,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。

2. 能被模块化的不仅仅是 JS ,所有的静态资源,例如css,图片等都能模块化,即以require的方式引入。

3. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。

webpack与gulp的区别

gulp合并后仍然是你写的代码,只是局部变量名被替换,一些语法做了转换而已,整体内容并没有发生改变。

Webpack打包后的代码已经不只是你写的代码,其中夹杂很多webpack自身的模块处理代码。

他们的定位是不同的。对gulp来说,他旨在规范前端开发流程。webpack更是明显强调模块化开发,而那些文件压缩合并、预处理等功能,不过是他附带的功能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery1.5.1 animate方法源码阅读
Apr 05 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
Dec 21 Javascript
js精度溢出解决方案
Dec 02 Javascript
jQuery实现HTML5 placeholder效果实例
Dec 09 Javascript
jquery.validate使用时遇到的问题
May 25 Javascript
简要了解jQuery移动web开发的响应式布局设计
Dec 04 Javascript
ClearTimeout消除闪动实例代码
Feb 29 Javascript
最丑的时钟效果!js canvas时钟制作方法
Aug 15 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
Mar 23 jQuery
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
layui 中select下拉change事件失效的解决方法
Sep 20 Javascript
JS面试题中深拷贝的实现讲解
May 07 Javascript
webpack css加载和图片加载的方法示例
Sep 11 #Javascript
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 #Javascript
webpack的CSS加载器的使用
Sep 11 #Javascript
JavaScript基础教程之如何实现一个简单的promise
Sep 11 #Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 #Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 #Javascript
Angular6 正则表达式允许输入部分中文字符
Sep 10 #Javascript
You might like
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python取均匀不重复的随机数方式
2019/11/27 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
法学专业本科生自荐信范文
2013/12/17 职场文书
申论倡议书范文
2014/05/13 职场文书
计算机软件专业求职信
2014/06/10 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
音乐课外活动总结
2015/05/09 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android