利用yarn实现一个webpack+react种子


Posted in Javascript onOctober 25, 2016

一、初始化项目

首先确保你的node 版本 >=4.0.并且确保yarn可以正常工作,关于安装yarn,你可以看这里

我们先创建个空文件夹 比如yarn-react-webpack-seed,然后输入命令:

yarn init

yarn 如果没有安装,全程用 npm代替也没问题。

项目会初始化 package.json ,然后填写一些基本信息即可。

接下来我们开始安装依赖项,再 package.json 的添加下面内容

"dependencies": {
 "react": "^15.4.0-rc.4",
 "react-dom": "^15.3.2",
 "react-router": "^2.8.1"
 },
 "devDependencies": {
 "babel": "^6.5.2",
 "babel-core": "^6.17.0",
 "babel-loader": "^6.2.5",
 "babel-preset-es2015": "^6.16.0",
 "babel-preset-react": "^6.16.0",
 "history": "^4.3.0",
 "react-hot-loader": "^3.0.0-beta.6",
 "webpack": "^1.13.2",
 "webpack-dev-server": "^1.16.2"
 },

运行命令:

yarn install

你也可以自行添加依赖,输入yarn add xxx即可。

yarn add react 
yarn add webpack --dev 
...

项目创建好后,我们接下来创建一些必要的文件和目录;

+ build
+ src
- webpack.config.js
- package.json
- index.html
- server.js

二、webpack

webpack (更多)是一款模块处理器,他会将你所有的代码打包成静态文件,放到你的开发的App中。

打开webpack.config.js,然后添加下面的代码:

var webpack = require('webpack');

module.exports = { 
 entry: [
  "webpack-dev-server/client?http://localhost:9000",
  'webpack/hot/only-dev-server',
  "./src/index"
 ],
 output: {
 path: __dirname + '/build',
 filename: "bundle.js",
 publicPath: '/build/',
 },
 module: {
 loaders: [
  {
  test: /\.js?$/,
  loaders: ["react-hot-loader/webpack",'babel-loader?presets[]=react,presets[]=es2015'],
  exclude: /node_modules/
  },

  {
  test: /\.less$/,
  loader: "style!css!less"
  }
  ]
 },
 plugins: [
  new webpack.NoErrorsPlugin(),
  new webpack.HotModuleReplacementPlugin()
 ]
};

这份文件大概有四个配置项entry, output, module,plugins.

     entry:指定打包的入口文件,每有一个键值对,就是一个入口文件。

     output:配置打包结果,path定义了输出的文件夹,filename则定义了打包结果文件的名称,filename里面的[name]会由entry中的键替换,例子中的/build/bundle.js便是生成的文件。

     module:定义了对模块的处理逻辑,这里可以用loaders定义了一系列的加载器,以及一些正则。当需要加载的文件匹配test的正则时,就会进行处理。这里我们使用了react-hot 和 babel。babel-loader是我们使用ES-6进行开发时用于生成JS文件。

     loader对文件进行处理,这正是webpack强大的原因。比如这里定义了凡是.js结尾的文件都是用babel-loader做处理,而.jsx结尾的文件会先经过jsx-loader处理,然后经过babel-loader处理。yarn add添加这些插件。babel中的preset配置你也可以.babelr文件中定义:

{
 "presets": [ "es2015", "react"],
}

     plugins: 这里定义了需要使用的插件,比如commonsPlugin在打包多个入口文件时会提取出公用的部分,生成common.js。

这个时候我们再package.json中加入script 字段,

"scripts": {
 "start": "node server.js",
 "build": "webpack --progress --colors"
 }

这个时候我们输入一个yarn start命令时候我们会启动一个webpack server这个时候你可以访问 http://localhost:9000/ 看到我们的页面了; 如果你使用yarn run build时候可以将文件自动生成到bulid/下。

接下来我们新建index.html文件

<!doctype html> 
<html lang="en" > 
<head> 
<meta charset="UTF-8"> 
<title>React+React-Router+Webpack+Yarn Seed</title> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> 
</head> 
<body > 
<div id="app"></div> 
<script src="./build/bundle.js"></script> 
</body> 
</html>

在index.html中最重要的是引入 bundle.js,实际上index.html你可以随意修改任何代码,重要是的引入生成后的文件以及含有react渲染的DOM。

三、React-router

完成项目的基本创建,接下来我们创建src/index.js项目的入口文件。代码如下:

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import App from './app';

ReactDOM.render(<App />, document.getElementById('app'));

接下来我们再创建一些包含路由组件的文件src/app.js

import React, { Component } from 'react'; 
import { render } from 'react-dom'; 
import { Router, Route, hashHistory } from 'react-router'; 
// components
import Links from './components/links.js'; 
import Start from './components/start.js'; 
import Guide from './components/guide.js'; 
import How from './components/how.js';

class App extends Component { 
 render() {
 return (
  <Router history={hashHistory}>
  <Route path="/" component={Links}>
   <Route path="/start" component={Start}/>
   <Route path="/how" component={How}/>
   <Route path="/guide" component={Guide}/>
  </Route>
 </Router> 
 );
 }
}
export default App;

头部是我们将要用的reactreact-router的模块引进来。 同时我们把用到的组件Links,Start,Guide等引进来。然后我们需要配置router

Route中设置具体的path 和组件。

接下来我们看看如何进行路由的切换,这些内容存放到src/components/links.js中。

import React from 'react'; 
import { Link } from 'react-router' 
let Links = React.createClass({ 

 render() {
 return(
  <div>
  <aside>
   <h4>Categories</h4>
   <ul role="nav">
   <li><Link to="/start" activeStyle={{color:'#3498db'}}>Start</Link></li>
   <li><Link to="/how" activeStyle={{color:'#3498db'}}>How</Link></li>
   <li><Link to="/guide" activeStyle={{color:'#3498db'}}>Guide</Link></li>
   </ul>
  </aside>

  <div className="page main">
   {this.props.children}
  </div>
  </div>
 );
 }
});

export default Links;

在Link 中我们可以指定具体的路由地址。

剩下的就是添加组件了,比如我们添加一个简单的start.js到components下面。

import React from 'react';

let Start = React.createClass({ 

 render() {
 return(
  <div className="c-home">
  <img alt="guide" src="http://img1.vued.vanthink.cn/vuedd144134a46129d7068d36025d64ba905.png" />
  <h4>React+React-Router+Webpack+Yarn Seed</h4>
  </div>
 );
 }
});
export default Start;

其他的组件代码就不详细展示了。

这个时候我们输入yarn run build,我们可以看到build下会生成一个bundle.js 文件。 如果输入 yarn run start就可以看见页面了

本地输入 yarn start 然后访问 http://localhost:9000 就可以看到自己写的内容了。

关于React-Router的更多配置,可以参考官方文档的教程。

四、发布

实际上我们有很多方法可以上线你的服务,但是非常好的一件事情是webpack 可以轻松的使用生成的文件。其中你可以快速的将这些资源文件放到cdn上,然后将index.html放到主机上,更新我们的脚本路径就可以了。

这次改变用yarn的安装速度确实比原来npm快了很多几乎都是10s内就完成了。不需要长时间等待或者切换taobao npm 镜像。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
javaScript call 函数的用法说明
Apr 09 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
Sep 15 Javascript
jquer之ajaxQueue简单实现代码
Sep 15 Javascript
jquery+javascript编写国籍控件
Feb 12 Javascript
Webwork 实现文件上传下载代码详解
Feb 02 Javascript
纯JS代码实现一键分享功能
Apr 20 Javascript
javascript深拷贝的原理与实现方法分析
Apr 10 Javascript
JavaScript实现跟随滚动缓冲运动广告框
Jul 15 Javascript
深入探究AngularJs之$scope对象(作用域)
Jul 20 Javascript
一篇文章带你从零快速上手Rollup
Sep 07 Javascript
全面解析js中的原型,原型对象,原型链
Jan 25 Javascript
Yarn的安装与使用详细介绍
Oct 25 #Javascript
jQuery通过ajax快速批量提交表单数据
Oct 25 #Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 #Javascript
JavaScript模仿Pinterest实现图片预加载功能
Oct 25 #Javascript
微信小程序 video组件详解
Oct 25 #Javascript
微信小程序 form组件详解
Oct 25 #Javascript
微信小程序 icon组件详细及实例代码
Oct 25 #Javascript
You might like
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
javascript知识点收藏
2007/02/22 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Python 忽略warning的输出方法
2018/10/18 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
事业单位绩效考核实施方案
2014/03/27 职场文书
国际贸易专业求职信
2014/06/04 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
给老婆道歉的话
2015/01/20 职场文书
婚育证明样本
2015/06/16 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis