详解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 相关文章推荐
extjs3 combobox取value和text案例详解
Feb 06 Javascript
js jquery获取随机生成id的服务器控件的三种方法
Jul 11 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
初学者AngularJS的环境搭建过程
Oct 27 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
微信小程序模版渲染详解
Jan 26 Javascript
vue watch深度监听对象实现数据联动效果
Aug 16 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
Angular Excel 导入与导出的实现代码
Apr 17 Javascript
在Vue项目中,防止页面被缩放和放大示例
Oct 28 Javascript
JavaScript随机数的组合问题案例分析
May 16 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连接数据库代码应用分析
2011/05/29 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
java解析json方法总结
2019/05/16 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
vue中使用rem布局代码详解
2019/10/30 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
spyder常用快捷键(分享)
2017/07/19 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
对python模块中多个类的用法详解
2019/01/10 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
tensorflow 模型权重导出实例
2020/01/24 Python
怎样比较两个类型为String的字符串
2016/08/17 面试题
公司前台辞职报告
2014/01/19 职场文书
党员批评与自我批评
2014/10/15 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
python3操作redis实现List列表实例
2021/08/04 Python
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技