webpack是最近比较火的构建工具,搭配上同样比较火的ReacJS与ES6(ES2015)一定是现在很多潮流 programmer 的追求。 废话不多,下面就就看下如何从0搭起我们的构建工具。

安装

全局安装webpack,如果安装后还是提示没有webpack commond,可以尝试通过超级管理员身份安装。

$ npm install webpack -g
$ sudo npm install webpack -g 

或者在项目里进行安装

$ npm install webpack --save-dev

配置

创建目录

index.js文件内容:

document.write('Hello Webpack');

生成package.json文件,-y为生成默认内容

$ npm init
$ npm init -y 

创建webpack.config.js文件

var webpack = require('webpack');

module.exports = {

    entry: './app/index.js', //入口

    output: { //输出
path: 'bundle',
publicPath: '/static/',
filename: 'bundle.js'
}, module: {
loaders: [ //加载器
{test: /\.css$/, loader: 'style-loader!css-loader' },
{test: /\.js$/, loader: 'babel-loader'},
{test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}
]
} }

注意输出中有一个path属性和一个publicPath属性,这二者的区别在于path为本地路径,publicPath是你启用服务器(webpack-dev-server/react-hot-loader)时的路径。

在webpack中所以的资源都需要通过加载器加载,多个加载器之间用 ! 隔开,其中-loader的后缀是可以省略的。

webpack.config文件中每个申明的加载器都需要安装,否则运行会报错:

$ npm install style-loader css-loader --save-dev

鉴于一个项目中会有N多个loader,通常将这些loader写入package.json文件的devDependencies属性中,之后通过 $ npm install 命令一次全部安装。

这里选用 babel 加载器来加载我们的JS文件,使用它最少需要安装 babel-core 与 babel-loader。如果想用 babel 解析 ES6 和 React,还需要安装上图中的 babel-preset-es2015 和 babel-preset-react,这个后面再说。

运行

上述配置工作完成后我们来启动webpack

$ webpack

执行该命令后,项目下多了个 bundle 文件夹,里面有输出的 bundle.js 文件

在index.html中引入编译过的bundle.js

<script src="../bundle/bundle.js"></script> 

运行index.html文件

这样就完成了基本配置并跑起了第一个DEMO,看下其他比较实用的命令

$ webpack --config xxx.js //使用另一份config文件

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

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

$ webpack -d //生成map映射文件

初上手第二个和第三个命令比较常用,--watch 使得我们不用每更改一次代码就执行一次 $ webpack。-p会压缩打包文件,使得体积减小很多,通常将压缩后的文件发布到线上。

webpack中,所有资源都是通过模块化的方式引入的。其同时支持commonjs和AMD的语法。接下来我们引入css文件。同时别忘记安装 style-loader 与 css-loader。

style.css 内容

body {
color: red;
}

index.js 内容

require('./style.css');
document.write('Hello Webpack');

结果

支持ES6

上文说过要支持ES6,还需要安装babel-preset-2015。

$ npm install babel-preset-es2015

安装好之后修改webpack.config文件如下:

{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015']
}
}

这里我们通过在app目录下创建 app.js 文件:

let a = 'ES6 is working!';
export default a;

修改 index.js

import './style.css';
import text from './app.js';
alert(text);
document.write('Hello Webpack');

结果

支持ReactJS

首先安装 react 与 babel-preset-react

$ npm install react react-dom babel-preset-react --save-dev

修改 webpack.config,在preset属性中添加react一项。

{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015', 'react']
}
}

修改 app.js 内容

import React, { Component } from 'react';

class App extends Component {
render() {
return (
<h1>React is working!</h1>
);
}
} export default App;

修改 index.js 内容

import './style.css';
import React from 'react';
import ReactDOM from 'react-dom';
import Title from './app.js'; ReactDOM.render(<Title />, document.body);

结果

这样我们就可以在静态项目里同时使用ES6与React了,下面我们看看如果通过本地服务器实现浏览器自动刷新。

如果你项目中并没有用到React,你可以通过webpack-dev-server来实现自动刷新。如果使用了React,可以使用量身定做的React-hot-loader。

下面来依次说说二者。

webpack-dev-server

安装

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

更改 index.html文件

<script src="static/bundle.js"></script>

此时的路径就是 webpack.config 文件中 publickPath 中设置的

运行

webpack-dev-server
webpack-dev-server --port 3000

服务默认启动8080端口,通过--port命令可以更改端口。这样我们就可以在localhost:3000/index.html访问到我们的页面了。

热刷新

webpack的热刷新分为iframe模式与inline模式

iframe模式操作要简单许多,其并不需要更改配置,只需要访问localhost:3000/webpack-dev-server/index.html。

现在当我们更改 js 文件时浏览器就会自动刷新。

inline模式有兴趣可以去参考文档。

react-hot-loader

安装

npm install react-hot-loader --save-dev

更改 webpack.config 文件,并引入插件。

entry: [
  'webpack-dev-server/client?http://localhost:2000',
  'webpack/hot/only-dev-server',
  './js/index.js'
],
plugins: [
  new webpack.HotModuleReplacementPlugin()
],
module: {
  loaders: [{
    test: /\.js$/,
    loaders: ['babel', 'react-hot'],
  }]
}

创建 server.js 文件

var webpack = require('webpack'),
WebpackDevServer = require('webpack-dev-server'),
config = require('./webpack.config'); new WebpackDevServer(webpack(config), {
  publicPath: config.output.publicPath,
  hot: true,
  historyApiFallback: true
}).listen(3000, 'localhost', function (err, result) {
  if (err) {
    return console.log(err);
  }
  console.log('Listening at http://localhost:3000/');
});

使用命令启动

node server.js

也可以写入 package.json 中

"scripts": {
  "start": "node server.js"
}

运行

npm start

这样React项目就可以实现热刷新了,不过在实际使用过程中还是会遇到各种坑。这里引入个完整的官方DEMO,亲测可用,文档也非常简洁明了。

https://github.com/gaearon/react-hot-boilerplate

webpack React+ES6的更多相关文章

  1. Webpack+React+ES6开发模式入门指南

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  2. webpack+react+es6开发模式

    一.前言 实习了两个月,把在公司用到的前端开发模式做个简单的整理.公司里前端开发模式webpack+react+redux+es6,这里去掉了redux. webpack, react, redux等 ...

  3. webpack + react + es6, 并附上自己碰到的一些问题

    最近一直在学react,react的基础部分已经学得差不多了,然而自己并没有做详细的记录,有兴趣的同志可以参考阮一峰老师的教程,个人觉得挺不错的,链接如下:https://github.com/rua ...

  4. Webpack+React+ES6入门指南[转]

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  5. Webpack+React+ES6 最新环境搭建和配置(2017年)

    刚刚学习React,发现React在ES6下的语法才是本体,结合ES6新的语言特性,使组件化开发显得更加直观.而且现在的Angular2也开始使用支持强类型的TypeScript,转译(transpi ...

  6. webpack学习(六)—webpack+react+es6(第3篇)

    接上篇 : webpack学习(六)—webpack+react+es6(第2篇) 上篇其实是有问题的,问题在取服务器数据这块.this.props 表示那些一旦定义,就不再改变的特性,而 this. ...

  7. webpack学习(六)—webpack+react+es6(第2篇)

    接上篇        webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...

  8. webpack学习(五)—webpack+react+es6(第1篇)

    如果你看过webpack学习系列的前一个文章,接下来做的东西会比较简单 :webpack学习(四)— webpack-dev-server react发展的很快,现在大部分开发react相关的项目,都 ...

  9. 一分钟搭建Webpack+react+es6框架

    最近react刷屏的厉害,而随着它一起走进我们视野的还有webpack,webpack只是个工具,为什么如此火呢?因为简单好了不废话.   直接进入正题: 打开命令行工具: npm install - ...

随机推荐

  1. 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中

    一. 事件:说白了就是调用函数的一种方式.它包括:事件源.事件数据.事件处理程序. JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. ...

  2. HDOJ 2120 并查集

    并查集的应用,用来查找被分割的区域个数. 即当两个节点值相同时说明已经为了一个圈,否则不可能,此时区域个数加1. #include<iostream> #include<cstdio ...

  3. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

  4. Android项目实战手机安全卫士(01)

    目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...

  5. JAVA之等号、传类对象参数与c++的区别

    在JAVA中用等号对类对象进行赋值,实际上操作的是对象的地址. eg: package MyText; class ClassA { int value; public void seta(int v ...

  6. [置顶] 让金融互联网-P2P网贷融资量增长10倍的广告宣传公益活动

    我想做一件什么事?一个公益活动,所有资料都会共享出来--- 再次声明:这是一次公益,所有资料会公开. 我正在做一点事:收集各个P2P信贷公司(包括线上线下的),然后给线上P2P信贷公司做营销策略,教他 ...

  7. cocos2d-x on wp8架构简单介绍

    1,基于C++的开发架构 支持3大移动平台以及3大桌面平台. 分为图形,声音,物理3大模块,另外还有脚本的导出. 在wp8/win32上的图形是基于d3d的,而在其它平台是基于opengl/openg ...

  8. PHP - 子类使用父类的构造函数

    /* * 子类使用父类中的构造方法. */ //父类方法 class Person { //父类中的构造方法 function __construct(){ echo '这是父类中的构造方法!'; } ...

  9. POJ 2635 The Embarrassed Cryptographer 高精度

    题目地址: http://poj.org/problem?id=2635 题意:给出一个n和L,一直n一定可以分解成两个素数相乘. 让你判断,如果这两个素数都大于等于L,则输出GOOD,否则输出最小的 ...

  10. sql: sql developer使用

    在sql developer中登陆某数据库,在procedure里面加入一个proc,种类选ARBOR: CREATE OR REPLACE PROCEDURE PROCEDURE23 IS NAM ...