1. 最近在研究react项目,接触到webpack打包工具。刚接触的时候一脸茫然,经过最近的学习,下面我来带大家开启webpack入门之旅。

webpack是什么

webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、样式(含less/sass)、图片等都作为模块来使用和处理。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成少量的 bundle - 通常只有一个,由浏览器加载。 当然做react项目也可以不用webpack构建工具,可以用gulp或者grunt等构建工具,但是GitHub 上面rect相关项目都是用webpack来构建的,官方推荐也是webpack更为合适,所以我们没有理由不掌握它。

Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的入口文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个浏览器可识别的JavaScript文件。

webpack 的优势

  1. 在webpack看来一切都是模块,包括javascript、css以及图片等。

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

  3. 扩展性强,插件机制完善。

webpack文件配置

webpack有四个核心概念:入口(entry)、输出(output)、加载器(loader)、插件(plugins)。下面来看一下webpack.config.js文件

  1. const webpack = require('webpack');
  1. const ExtractTextPlugin = require('extract-text-webpack-plugin'); //css单独打包插件
  2.  
  3. module.exports = {
  4. //页面入口文件
  5. entry: {
  6. app: './src/app'
  7. },
  8. //打包文件输出配置
  9. output: {
  10. path: 'dist/js',//打包输出路径
  11. filename: '[name].min.js',//文件名字
  12. },
  13. //自动扩展文件后缀名,意味着我们在项目中import模块可以省略不写后缀名
  14. resolve: {
  15. extensions: ['.js', '.jsx']
  16. },
  17. //模块加载器(图片/js/css/等等)
  18. module: {
  19. rules: [{
  20. test: /\.(js|jsx)$/,
  21. exclude: /^node_modules$/,
  22. use: [{
  23. loader: 'babel-loader',
  24. options: {
  25. presets: ['es2015', 'react'],
  26. plugins: ["transform-object-rest-spread"]
  27. }
  28. }]
  29. },{
  30. test: /\.less$/,
  31. exclude: /^node_modules$/,
  32. loader: ExtractTextPlugin.extract({
  33. fallback: 'style-loader',
  34. use: 'css-loader!less-loader'
  35. })
  36. }, {
  37.  
  38. test: /\.(png|jpg|gif)$/,
  39. exclude: /^node_modules$/,
  40. include: path.resolve(__dirname, './img'),
  41. loader: 'url-loader',
  42. options: {
  43. limit: 8192 //图片文件小于8kb的直接转为base64
  44. }
  45. }]
  46. },
  47. //插件项(这里用里一个css单独打包,否则css文件会和js文件打包在一起)
  48. plugins: [
  49. new ExtractTextPlugin("styles.min.css")
  50. ]
  51. }

生产环境webpack.prod.js配置

webpack 自带了 UglifyJsPlugin,它运行 UglifyJS来压缩输出文件。

  1. // webpack.prod.js
  2. const webpack = require('webpack');
  3. const HtmlWebpackPlugin = require('html-webpack-plugin')
  4.  
  5. module.exports = {
  6. /*...*/
  7. new webpack.optimize.UglifyJsPlugin({
  8. output: {
  9. comments: false // 删除注释
  10. },
  11. compress: {
  12. warnings: false // 不显示警告,默认为false
  13. }
  14. }),
  15. new HtmlWebpackPlugin({ //根据模板插入css/js等生成最终HTML
  16. filename: 'build/', //生成的html存放路径
  17. template: './src/template/index.html', //html模板路径
  18. hash: true, //为静态资源css文件和js生成hash值
  19. title: '口袋',
  20. favicon: './img/favicon.ico',
  21. inject: true, //所有js资源放到body底部
  22. minify: {
  23. removeComments: true, //去掉注释
  24. collapseWhitespace: true, //去掉空格
  25. minifyCSS: true, //压缩html里的css
  26. minifyJS: true //压缩html里的js
  27. }
  28. }),
  29. };

html-webpack-plugin插件详解请看(https://www.npmjs.com/package/html-webpack-plugin)

安装方法

$ npm install webpack -g

运行webpack

webpack --display-error-details 后面参数“--display-error-details”是推荐加上的,方便出错时能更好定位到问题。 其他主要参数有:

$ webpack --watch //监听变动并自动打包

$ webpack -p //压缩混淆脚本

$ webpack -d //生成map映射文件,告知哪些模块被最终打包到哪里了

下面我们添加一个用于启动 webpack 的 npm script 脚本:
package.json

  1. {
  2. "name": "demo",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "webpack.config.js",
  6. "scripts": {
  7. "test": "echo \"Error: no test specified\" && exit 1",
  8. "dev": "webpack-dev-server --config webpack.config.js --inline --hot",
  9. "build": "webpack --config webpack.prod.config.js"
  10. },
  11. "keywords": [],
  12. "author": "",
  13. "license": "ISC",
  14. "devDependencies": {
  15. "css-loader": "^0.28.4",
  16. "csv-loader": "^2.1.1",
  17. "file-loader": "^0.11.2",
  18. "html-webpack-plugin": "^2.29.0",
  19. "style-loader": "^0.18.2",
  20. "webpack": "^3.0.0",
  21. }
  22. }

开发环境运行方法

使用 webpack-dev-server 开发服务是一个更好的选择。webpack-dev-server是一个小型的Node.js Express服务器,它将启动一个 express 静态资源 web 服务器,并且会以监听模式自动运行 webpack,在浏览器打开 http://localhost:8080/ (端口号可配置) 可以浏览项目中的页面和编译后的资源输出,并且通过一个 socket.io 服务实时监听它们的变化并自动刷新页面。

有一点需要注意的是:webpack-dev-server启动项目生成的包并没有放在你的真实目录中,而是放在了内存中,你从chrome浏览器中Source面板中可以看见.

现在,我们可以在命令行中运行 npm start,就会看到浏览器自动加载页面。如果现在修改和保存任意源文件,web 服务器就会自动重新加载编译后的代码。赶紧试一下!

生产环境运行方法

使用 npm run build启动项目

不熟悉npm scripts的,请找阮老师文章 [http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html

基于 webpack 指引就写到这里,要是看了之后能够让一脸的茫然的你豁然开朗,可以请我喝咖啡,你也可以参考下述的文章来入门:

[http://zhaoda.net/webpack-handbook/install.html]
[http://webpack.github.io/docs/]

webpack构建工具快速上手指南的更多相关文章

  1. 深入浅出的webpack构建工具---AutoDllPlugin插件(八)

    深入浅出的webpack构建工具---AutoDllPlugin插件(八) DllPlugin插件能够快速打包,能把第三方依赖的文件能提前进行预编译打包到一个文件里面去.提高了构建速度.因为很多第三方 ...

  2. Rancher 快速上手指南操作(1)

    Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...

  3. UnityShader快速上手指南(三)

    简介 这一篇还是一些基本的shader操作:裁剪.透明和法向量的应用 (纠结了很久写不写这些,因为代码很简单,主要是些概念上的东西) 先来看下大概的效果图:(从左到右依次是裁剪,透明,加了法向量的透明 ...

  4. [转]Rancher 快速上手指南操作(1)

    本文转自:http://www.cppblog.com/zhiyewang/archive/2016/03/17/213053.aspx Rancher 快速上手指南操作(1)该指南知道用户如何快速的 ...

  5. 深入浅出的webpack构建工具--webpack4+vue搭建环境 (十三)

    深入浅出的webpack构建工具--webpack4+vue搭建环境 (十三) 从上面一系列的webpack配置的学习,我们现在来使用webpack来搭建vue的开发环境.首先我们来设想下我们的项目的 ...

  6. 深入浅出的webpack构建工具---DevServer配置项(二)

    深入浅出的webpack构建工具---DevServer配置项(二) 阅读目录 DevServer配置项 1. contentBase 2. port 3. host 4. headers 5. hi ...

  7. 深入浅出的webpack构建工具---webpack基本配置(一)

    深入浅出的webpack构建工具---webpack基本配置(一) 阅读目录 一:webpack入门构建: 1. 安装webpack到全局 2. 安装webpack到本项目. 3. 如何使用webpa ...

  8. 翻译-QPKG开发工具快速开始指南

    QPKG开发工具快速开始指南 指导你编译你自己的QPKG软件包 目录 什么是QDK 下载QDK 安装QDK 编译你自己的QPKG软件包 搭建QPKG编译环境 配置QPKG 定制QPKG程序 向QPKG ...

  9. Markdown快速上手指南

    Markdown快速上手指南 1.Markdown介绍 markdown可以实现快速html文档编辑,格式优没,并且不需要使用html元素. markdown采用普通文本的形式,例如读书笔记等易于使用 ...

随机推荐

  1. SQL Server 2012安装step by step

    安装光盘介质问题,报错,换盘 Overall summary:  Final result:                  Passed  Exit code (Decimal):         ...

  2. 后台任务hangfire

    Installation¶ There are a couple of packages for Hangfire available on NuGet. To install Hangfire in ...

  3. orocos_kdl学习(一):坐标系变换

    KDL中提供了点(point).坐标系(frame).刚体速度(twist),以及6维力/力矩(wrench)等基本几何元素,具体可以参考 Geometric primitives 文档. Creat ...

  4. fiddler抓包参数乱码的解决方法

    解决方法: 1.win+R 2.打开注册表编辑器:输入regedit +回车+是 3.HKEY_CURRENT_USER\Software\Microsoft\Fiddler2 4.右键新建,选字符串 ...

  5. 【LeetCode】242. Valid Anagram (2 solutions)

    Valid Anagram Given two strings s and t, write a function to determine if t is an anagram of s. For ...

  6. sql中索引不会被用到的几种情况

    1.查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引. 比如,你查询的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一个包含Y值的组合索引, ...

  7. 关于tomcat不同版本的maxPostSize

    tomcat7.0.63之前: maxPostSize The maximum size in bytes of the POST which will be handled by the conta ...

  8. [Aaronyang] 写给自己的WPF4.5 笔记6[三巴掌-大数据加载与WPF4.5 验证体系详解 2/3]

    我要做回自己--Aaronyang的博客(www.ayjs.net) 博客摘要: Virtualizing虚拟化DEMO 和 大数据加载的思路及相关知识 WPF数据提供者的使用ObjectDataPr ...

  9. mysql 物理数据存放

    报错误:1030 - Got error 28 from storage engine 3.在系统中查看/tmp是否已经满了: [root@localhost /]# df /tmp/ Filesys ...

  10. kubernetes中port、target port、node port的对比分析,以及kube-proxy代理

    转:http://blog.csdn.net/xinghun_4/article/details/50492041 容器网络实例 服务中的3个端口设置 这几个port的概念很容易混淆,比如创建如下se ...