浅谈Webpack(一)

webpack官方文档

什么是webpack?

Webpack 是一个前端资源加载/打包工具(Module Bundler),它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。

只需要相对简单的配置就可以提供前端工程化需要的各种功能,并且如果有需要它还可以被整合到其他比如 Grunt / Gulp 的工作流。

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

为什么使用webpack?

现在的网站已经演化成 web app:

  • 一个页面内依赖着越来越多的 JavaScript
  • 现代浏览器有着越来越多的
  • 虽然单页内代码越来越多,但全页刷新越来越少

这意味着,客户端有着越来越多的代码。

一个大的代码库需要良好的组织,这需要模块系统来把代码库拆分成模块。

加载器loader

loader是把一个资源文件作为入参转换为另一个资源文件的 node.js 函数。

例如,可以通过loader来让 webpack 来加载 CoffeeScript 或 JSX 文件。

如果loader发布在 npm 上,那么可以通过下面的两个命令来安装

$ npm install xxx-loader --save
$ npm install xxx-loader --save-dev

安装webpack

$ npm install -g webpack

配置webpack

每个项目下都必须配置有一个 webpack.config.js ,它就是一个配置项,告诉webpack它需要做什么

看示例:

 1 const webpack = require(‘webpack‘);
 2
 3 module.exports = {
 4   devtool: ‘inline-source-map‘,
 5
 6   //页面入口文件配置
 7   entry: [
 8     ‘./public/entry.jsx‘,
 9     ‘webpack-hot-middleware/client‘
10   ],
11
12   //入口文件输出配置
13   output: {
14     path: __dirname,
15     publicPath: ‘/assets/‘,
16     filename: ‘bundle.js‘
17   },
18   module: {
19     //加载器配置
20     loaders: [{
21       test: /\.(js|jsx)$/,
22       exclude: /node_modules/,
23       loader: ‘babel‘,
24       query: {
25         presets: [‘es2015‘, ‘react‘]
26       }
27     },
28     {
29       test:/\.css$/,
30       exclude:/node_modules/,
31       loader:‘style!css‘
32     },
33     {
34       test: /\.(woff|woff2)$/,
35       loader: ‘url-loader?limit=10000&mimetype=application/font-woff‘
36     },
37     {
38       test: /\.ttf$/,
39       loader: ‘url?limit=10000&mimetype=application/octet-stream‘
40     },
41     {
42       test: /\.eot$/,
43       loader: ‘file‘
44     },
45     {
46       test: /\.svg$/,
47       loader: ‘url?limit=10000&mimetype=image/svg+xml‘
48     },
49     {
50       test: require.resolve(‘jquery‘),
51       loader: ‘expose?$!expose?jQuery‘
52     },
53     {
54       test: /\.(png|jpg)$/,
55       loader: ‘url-loader?limit=8192‘
56     }
57     ]
58   },
59
60   //插件项
61   plugins: [
62     // Webpack 1.0
63     new webpack.optimize.OccurenceOrderPlugin(),
64     // Webpack 2.0 fixed this mispelling
65     // new webpack.optimize.OccurrenceOrderPlugin(),
66     new webpack.HotModuleReplacementPlugin(),
67     new webpack.NoErrorsPlugin()
68   ]
69 };

1、plugins是插件项,这里我们用了三个插件方法:

webpack.optimize.OccurenceOrderPlugin(),webpack.HotModuleReplacementPlugin(),webpack.NoErrorsPlugin();

(1).webpack 给每个模块和分块分配了 id 来识别它们。webpack 可以通过new webpack.optimize.OccurenceOrderPlugin()给最常用的 id 分配最简短的 id 来进行优化;

(2).webpack.NoErrorsPlugin()是选择性的,主要的功能是当更改完的程序码有语法错误时不要重新整理。当错误修改后,画面会自动重新整理。

(3).webpack.HotModuleReplacementPlugin():Webpack-dev-server结合后端服务器的热替换配置

2、entry 是页面入口文件配置,output 是对应输出项配置(即入口文件最终要生成什么名字的文件、存放到哪里),其语法大致为:

 1 {
 2     entry:{
 3         page1: "./page1",
 4         //支持数组形式,将加载数组中的所有模块,但以最后一个模块作为输出
 5         page2: ["./entry1", "./entry2"]
 6     },
 7     output:{
 8         path: "dist/js/page",
 9         filename: "[name].bundle.js"
10     }
11 }

该段代码最终会生成一个 page1.bundle.js 和 page2.bundle.js,并存放到 ./dist/js/page 文件夹下。

3、module.loaders 是最关键的一块配置。它告知 webpack 每一种文件都需要使用什么加载器来处理:

module: {
        //加载器配置
        loaders: [
            //.css 文件使用 style-loader 和 css-loader 来处理
            { test: /\.css$/, loader: ‘style-loader!css-loader‘ },
            //.js 文件使用 jsx-loader 来编译处理
            { test: /\.js$/, loader: ‘jsx-loader?harmony‘ },
            //.scss 文件使用 style-loader、css-loader 和 sass-loader 来编译处理
            { test: /\.scss$/, loader: ‘style!css!sass?sourceMap‘},
            //图片文件使用 url-loader 来处理,小于8kb的直接转为base64
            { test: /\.(png|jpg)$/, loader: ‘url-loader?limit=8192‘}
        ]
    }

如上,"-loader"其实是可以省略不写的,多个loader之间用“!”连接起来。

注意所有的加载器都需要通过 npm 来加载,并建议查阅它们对应的 readme 来看看如何使用。

关于 webpack.config.js 更详尽的配置可以参考这里

运行webpack

$ webpack --display-error-details

后面的参数“--display-error-details”是推荐加上的,方便出错时能查阅更详尽的信息(比如 webpack 寻找模块的过程),从而更好定位到问题。

参考资料:http://www.cnblogs.com/vajoy/p/4650467.html

时间: 2024-08-24 15:05:33

浅谈Webpack(一)的相关文章

浅谈webpack打包原理

浅谈webpack打包原理 模块化机制 webpack并不强制你使用某种模块化方案,而是通过兼容所有模块化方案让你无痛接入项目.有了webpack,你可以随意选择你喜欢的模块化方案,至于怎么处理模块之间的依赖关系及如何按需打包,webpack会帮你处理好的. 关于模块化的一些内容,可以看看我之前的文章:js的模块化进程 核心思想: 一切皆模块: 正如js文件可以是一个"模块(module)"一样,其他的(如css.image或html)文件也可视作模 块.因此,你可以require('

浅谈webpack优化

webpack优化方案 1. 优化开发体验 1-1. 加快构建速度 ① 缩小文件搜索范围 由于 Loader 对文件的转换操作很耗时,需要让尽可能少的文件被 Loader 处理,用include和exclude去缩小: resolve.modules用于配置 Webpack 去哪些目录下寻找第三方模块:[path.resolve(__dirname, 'node_modules')](根目录下): resolve.mainFields用于配置第三方模块使用哪个入口文件:['mian']: res

前端架构浅谈

前端架构浅谈 0.前注 鉴于作者本人的能力有限(非常有限),并且依然在学习中,因此本文的高度和深度必然有所欠缺. 欢迎(并且非常欢迎)大家来批评指正,如果能详细的说明问题在哪里,如何解决和改正,那么就太感谢了!!! 我最喜欢听有理有据的批评了!! 本人QQ:20004604,邮箱:[email protected],期待你的交流. 1.为什么要有一个好的架构 首先明确一点,架构是为需求服务的. 前端架构存在的目的,就我个人理解来说,有以下几点: 1.提高代码的可读性. 一个好的架构,代码的可读性

【火的不行的前端你必须知道】一、浅谈node.js

引子: 现在都2017年了,在这个前端盛行的年头,在不懂一些前端流行的技术就落伍了,恰好公司H5端项目也是让这个方向去替换. 技术选型: 这里主要是简单说一下,后面会分章节详细分析 1.react: 目前最流行的前端框架之一 2.nowa: webpack系列的一个web工具,打包,编译等 3.react-keeper: 一种路由框架 4.ES6,这个不用介绍了吧(眯眼笑) 5.antd-mobile:阿里蚂蚁出的一个前端框架,面对大部分素材够用了 6.no-flux;状态管理的一种组件  这些

Vue浅谈

浅谈Vue 最近在学习Vue相关的知识点并且也做一些练手,就在学习过程中出现的各种坑爹的地方做一个总结!之后再遇到也不会抓瞎. 1.Vue工程的安装 (1)首先先安装node.js这是Vue的运行基础.登录官网下载相关包安装即可,不再赘述. (2)其次是安装Vue-cli 脚手架,进入到cmd命令行去执行下面命令. npm install vue-cli (3)创建基于webpack模板的项目 vue init webpack (项目名) (4)进入项目并且安装依赖包: npm install

浅谈vuex

通过购物车的一个案列,把vuex学习了一篇. vuex概念浅谈 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.简单的来说,就是数据共用,对数据集中起来进行统一的管理. 如果您的应用够简单,您最好不要使用 Vuex.一个简单的 global event bus 就足够您所需了.但是,如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜