webpack初探:用webpack进行react开发

webpack是当下较为火爆的前端构建工具。它类似一个黑盒,可以较为轻松地帮我们解决一些前端构建的重复工作。在某种程度上,它可以代替gulp的功能。但是,想要获得最佳的前端构筑体验,恐怕还是得gulp+webpack才行。

webpack学习起来不算太难,至少在我看来比gulp轻松。它通过配置文件webpack.config.js搭配合适的插件工作。

学习webpack+react,推荐这篇教程:Webpack傻瓜指南(三)和React配合开发。文章中有前两篇的地址。这三篇文章十分优秀,学习之后相信可以比笔者玩得溜(●'◡'●)这里只粗略记录一些心得。

npm

npm是node集成的包管理工具,由package.json配置。可以用"script"选项自定义命令。通过npm install * --save安装的包会成为程序依赖,npm install * --save-dev则会成为开发依赖。它们分别被记录在dependencies和devDependencies中。

在运行npm install时会默认安装两种包。你也可以使用npm install --production来只安装运行依赖包。

webpack核心

入口和出口

webpack配置大体可以分为入口、出口和处理器。一个最简单的webpack配置文件是这样的:

// webpack.config.js
module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  }
};

它没有处理器,所以没有任何用处。但是,它已经可以正常运行。你可以这样使用它:

  • webpack开发环境下编译
  • webpack -p产品编译及压缩
  • webpack --watch开发环境下持续的监听文件变动来进行编译(非常快!)
  • webpack -d引入source maps

处理器

react和es6语法

webpack使用各种loader和perset来处理文件。它可以替代browserify或者RequireJS的功能。现在,假设我们要用webpack加载和编译CoffeeScript和JSX+ES6。在开始之前确保你安装了react和react-dom

首先,安装loader和其它插件:npm install coffee-loader babel-loader babel-core babel-preset-es2015 babel-preset-react --save-dev

babel-core是babel汇编核心。es2015 preset则可以把es6语法的js代码转换为es5代码。

现在,我们可以写模块代码了。我们的配置文件变成了这样:

// webpack.config.js
module.exports = {
  entry: './main.js', // 入口文件
  output: {
    filename: 'bundle.js' // 打包输出的文件
  },
  module: {
    loaders: [
      {
        test: /\.coffee$/,  // test 去判断是否为.coffee的文件,是的话就是进行coffee编译
        loader: 'coffee-loader'
      },
      {
        test: /\.js$/, // test 去判断是否为.js,是的话就是进行es6和jsx的编译
        loader: 'babel-loader',
        query: {
          presets: ['es2015', 'react']
        }
      }
    ]
  }
};

如果你希望在require文件时省略扩展名,只需要添加resolve.extensions即可

...
resolve: {
    // 现在你require文件的时候可以直接使用require('file'),不用使用require('file.coffee')
    extensions: ['', '.js', '.json', '.coffee']
 }
...

现在,我们可以进行react编程了

css样式和图片

同样的,只要有loader就行了。首先用require()去加载它们

require('./bootstrap.css');
require('./myapp.less');

var img = document.createElement('img');
img.src = require('./glyph.png');

接着配置webpack.config.js

// webpack.config.js
module.exports = {
  entry: './main.js',
  output: {
    path: './build', // 图片和js会放在这
    publicPath: 'http://mycdn.com/', // 这里用来生成图片的地址
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      { test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, // 用!去链式调用loader
      { test: /\.css$/, loader: 'style-loader!css-loader' },
      {test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} // 内联的base64的图片地址,图片要小于8k,直接的url的地址则不解析
    ]
  }
};

当你require了CSS(less或者其他)文件,webpack会在页面中插入一个内联的<style>,去引入样式。当require图片的时候,bundle文件会包含图片的url,并通过require()返回图片的url。

更多

去这里看看:webpack-howto

锦上添花

sass

同样,你需要的只是loader
npm install node-sass sass-loader --save-dev
然后...

...
 module: {
   loaders: [
   ...
     {
       test: /\.scss$/,
       loaders: ['style', 'css', 'sass']
     }
   ...
   ]
 },
 ...

开发服务器

webpack的打包速度不是很快,一遍又一遍地运行时一件十分让人烦躁的事情。我们需要一个开发服务器
npm install webpack-dev-server --save-dev
这里的配置会开始有些复杂:

module.exports = {
  ....
  devServer: {
    historyApiFallback: true,
    hot: true,
    inline: true,
    progress: true,
  },
  ...
}

在package.json里自定义命令

...
"scripts": {
  "start": "webpack-dev-server --hot --inline"
},
...

接下来输入npm start就可以运行服务器了。

第三方库

npm install jquery moment --save-dev

var sub = require('./sub');
var $ = require('jquery');
var moment = require('moment');

结语

webpack的功能远比我们想的要强大,但也因此容易让我们迷失其中。永远不要忘记我们的目的是用这些工具去编写程序,而不是打造更完美的手脚架。但是,在很多时候它确实可以使我们的编程变得更加愉快。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容