转自:http://www.cnblogs.com/ghost-xyx/p/5483464.html

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踩坑之路——图片的路径与打包

    转自:http://www.cnblogs.com/ghost-xyx/p/5812902.html 刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不 ...

  2. webpack踩坑之路 (2)——图片的路径与打包

    刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle).下面我们就来分析下在webpack项目中图片的应用场景. ...

  3. Android 上传开源项目到 jcenter 实战踩坑之路

    本文微信公众号「AndroidTraveler」首发. 背景 其实 Android 上传开源项目到 jcenter 并不是一件新鲜事,网上也有很多文章. 包括我本人在将开源项目上传到 jcenter ...

  4. html2canvas的踩坑之路

    html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品 ...

  5. MySQL Connector/NET 使用小结(踩坑之路)

    背景描述 根据项目的需要,需连接MySQL获取数据. 首先,先了解一下项目的情况: 之前的代码是C#编写的的, 运行时:.NETFramework3.5. 由于项目已经部署上线,因此不能升级运行时,这 ...

  6. vue+ vue-router + webpack 踩坑之旅

    说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少 ...

  7. webpack踩坑--webpack 2.x升级至4.x

    一.安装webpack-cli,webpack@4.26.1 1.npm install webpack-cli -D 2.npm install webpack@4.26.1 -D 二.踩坑 执行n ...

  8. Java踩坑之路

    陆陆续续学Java也快一年多了,从开始的一窍不通到现在的初窥门径,我努力过,迷茫过,痛过,乐过,反思过,沉淀过.趁着新年,我希望能把这些东西记下来,就当是我一路走来的脚印. 一.初识网站应用 记得第一 ...

  9. Android SDK 开发——发布使用踩坑之路

    前言 在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的. 为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的. 背景 刚好最近自己遇到了类似需 ...

随机推荐

  1. 纯js实现10分钟倒计时

    一个简单实现倒计时的小栗子~ 效果图:简陋的不能再简陋了,捂脸 代码: <!DOCTYPE HTML> <html> <head> <title> 倒计 ...

  2. MySQL 博客文章目录(2016-08-20更新)

    1 MySQL安装配置 Linux MySQL源码安装缺少ncurses-devel包 Linux平台卸载MySQL总结 Linux 卸载mysql-libs包出现错误 2  MySQL管理配置 My ...

  3. CentOS 7 安装MySQL 5.6遇到的疑难杂症小结

    在一测试服务器(CentOS Linux release 7.2.1511)上安装MySQL 5.6(5.6.19 MySQL Community Server)时遇到下面错误,这个是因为CentOS ...

  4. TNS-12535: TNS:operation timed out案例解析

    一数据库突然连接不上,在自己电脑上使用SQL Developer也连接不上.立即使用SecureCRT连接上了这台服务器,从下面几个方面检查. 1:检查了数据库的状态是否正常 $ sqlplus / ...

  5. ios10.2真机调试包,ios升级10.2后需要添加

    下载地址: http://download.csdn.net/detail/koktear/9710820 添加地址: finder-应用程序-找到Xcode-右击显示包内容-Contents-Dev ...

  6. x01.TodoList:Asp.Net 5 初探

    ASP.NET 5 是比较新的,除了汤姆的博文,学习资料并不多.而学习没有例子上手,是比较痛苦的. 1.运行 vs2015,新建项目,选择 Asp.Net 5 WebApp 模板,默认运行即可.对照汤 ...

  7. linux 守护程序小记(指定进程不存在则启动 )

    最近想在debian 下做个守护进程.用于守护指定的程序一直处于运行状态.网上查了下,有Crontab方式和写脚本执行方式. Crontab Crontab 是系统自带的,类似于Windows的计划任 ...

  8. 【FLUENT案例】02:DPM模型

    1 引子1.1 案例描述1.2 学习目标1.3 模拟内容2 启动FLUENT并导入网格3 材料设置4 Cell Zones Conditions5 Calculate6 定义Injecions7 定义 ...

  9. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  10. springMVC注解初步

    一.(补充)视图解析器---XmlViewResolver 作用:分离配置信息. 在视图解析器---BeanNameViewResolver的基础之上进行扩充,新建一个myView.xml分离信息 在 ...