react目录结构
㈠ 怎么搭建react+webpack的目录结构
. 为什么用 webpack? 他像 Browserify, 但是将你的应用打包为多个文件. 如果你的单页面应用有多个页面, 那么用户只从下载对应页面的代码. 当他么访问到另一个页面, 他们不需要重新下载通用的代码. 他在很多地方能替代 Grunt 跟 Gulp
㈡ 为什么ReactJS在中国一点没有起色
1.安装node,因为ts的编译器是js/ts写的;安装node后同时获得npm命令,这是nodejs世界里的包管理器(也可以看作node的app商店);2.安装vs2015或者vscode,当然这不是必须的,但是这里强烈推荐写ts的工具,vs第一,vsc第二;3.vs自带了TypeScript(vs2012+,vs2015update1自带了ts1.7),最新版本的typescriptforvs去官网下载即可,或者如果不依赖vs(比如mac环境),可以用命令行装ts编译器npmi-gtypescript@next4.安装了ts后,就会有2个命令可用:tsc和tsd,tsc用来编译TypeScript代码,tsd用来下载第三方js类库的ts定义文件(或者叫头文件),熟练使用tsd,工作效率提升,因为减少了80%查文档的时间,所以写ts可以说是jser打通了任督二脉,上手任何新的开发环境都很快;5.命令行下载react的ts头文件,tsdinstallreact-global--save注意上面之所以写react-global而不是react,因为我们接下来使用比较原始的写法,直接把React当作全局对象使用,而不作为es6模块(必须用import引入),不需要Babel编译也不需要webpack打包;上面执行的tsd命令下载了ReactJS类库的头文件,下面用tsc命令创建一个ts项目配置文件tsc--init命令创建了tsconfig.json配置文件,打开该文件增加"jsx":"react",就是自动把tsx变成最终的js,而不是jsx把"outDir":"built",这行去掉,这样编译的文件就会在当前目录输出"target":"es5",这里es3改成es5,"watch":true是否监听文件修改如果你用的是vs,这行不重要6.下载reactjs文件,如果没有安装bower命令,可以手动去官网下载react类库bowerinstall--savereact7.以上环境配置好了,开始写代码:创建一个demo.tsx文件(注意这里是tsx,不是ts也不是jsx)创建一个demo.html,添加文件的引用8.demo.tsx写代码classMyClassextendsReact.Component{render(){returnhello{this.props.name};}}document.addEventListener('DOMContentLoaded',function(){ReactDOM.render(,document.body);});9.如果保存了demo.tsx后,没有在目录下发现自动编译了demo.js,那么可能是vs没配置好,如果你没有装vs或者vsc,没关系,在当前文件夹下命令行运行tsctsc命令会自动根据tsconfig.json里面配置的情况,自动帮你把代码编译成js,这是编译后的js文件10.打开demo.html可以看到效果了;11.至于题主说怎么学习,其实跟JS完全没两样,上面demo.tsx的代码,跟react官网的es6写法一模一样多了这两个prop和states类型约束,仅此而已;11.至于题主说怎么学习,其实跟JS完全没两样,上面demo.tsx的代码,跟react官网的es6写法一模一样多了这两个prop和states类型约束,仅此而已;12.下班,有空再写;------时间分割------13、继续写,对1-12进行润色,转入传教模式;以上的代码,工厂方法在创建子类的同时,做了一些初始化的动作,这与单纯的原型继承不同,所以在使用class方式进行子类继承,这样的写法是无效的;classMyViewextendsReact.Component{render(){returnhello{this.state.name};//会抛异常,因为state是null}//不起作用的getInitialState:(){return{name:'',age:20};}}需要改成如下方式,下面是官网给出的方案(这里TypeScript和ES6情况是一样的)classMyViewextendsReact.Component{constructor(props,context){super(props,context);this.state={name:'',};}render(){returnhello{this.state.name};}}16、当组件化遇到强类型:从前写JS组件,一般复用性比较差,基本写完就仍,原因如下:1)暴露了太多的Dom结构以及别的实现细节;2)命名挫,缺乏可记忆性,本身编程中变量和方法的命名对于码农来说就是天坑;3)JS天生缺乏私有和公共成员的约束,不加注释根本不知道怎么使用该类库/组件;React解决了把dom标签暴露出去的问题,TS则解决了语言层面的问题,并提供了强大的重构能力,你根本不需要记住组件的API,因为工具会列出来;
㈢ 如何用reactjs构建一个完整的前端页面
用reactjs构建一个完整的前端页面的步骤:
准备:React 的安装包,建议去官网下载安装
1、使用 React 的网页源码,结构大致如下:
<!DOCTYPE html><html><head> <script src="../build/react.js"></script> <script src="../build/react-dom.js"></script> <script src="../build/browser.min.js"></script></head><body> <div id="example"></div> <script type="text/babel"> // **用户代码 ** </script></body></html>
上面代码有两个地方需要注意。
首先,最后一个<script>标签的type属性为text/babel。这是因为 React 独有的 JSX 语法,跟 JavaScript 不兼容。凡是使用 JSX 的地方,都要加上type="text/babel"。
其次,上面代码一共用了三个库:react.js、react-dom.js和Browser.js,它们必须首先加载。其中,react.js是 React 的核心库,react-dom.js是提供与 DOM 相关的功能,Browser.js的作用是将 JSX 语法转为 JavaScript 语法,这一步很消耗时间,实际上线的时候,应该将它放到服务器完成。
2、将src子目录的js文件进行语法转换,转码后的文件全部放在build子目录。
$ babel src --out-dir build
3、渲染转换成html节点,以方便操作dom:
ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。
这里以插入hello world为例来说明
ReactDOM.render(<h1>Hello, world!</h1>,document.getElementById('example'));
4、运行结果如下:
㈣ 如何评价 React 实现的前端 UI 库 material-ui
非常厉害,做一些功能为主,不需要过多品牌调性的 WebApp
只需要前端+交互就可以快速构建做出非常不错的产品
(icon还是有点点难度,有设计比较专业的人员跟着做产品的质量会更加“产品级”一些)
框架用了很多 MD 的视觉元素,但是还是只是“看着像”,交互,动画世界观之类的实现距离最理想的 MD 还是有差距,不过基本感觉可以忽略不计。
非要挑刺的话,就是 Menu 部分的动画设计感觉有点粗糙,做得不够好(MD 的世界观,所有东西的诞生都是“扩散”出来,而不是“缩放”出来的,还有就是先“慢_快”的缓动做得还是差一点点)
㈤ 如何使用 ES6 编写一个 React 模块,并且编译后发布到 NPM
前言
如果你在使用 React, 那么肯定已经撸了好多自己的组件, 并尝试着共享出来。在 OneAPM 前端开发过程中, 我们也曾遇到了一些组件共享的问题:
例如:
是通过 git 直接发布还是通过 NPM 发布 ?
发布的是 ES5 的代码还是 ES6 的代码 ?
如何解决 Babel5 和 Babel6 的冲突 ?
这篇文章会通过编写一个叫做 MyComponet 的例子来演示发布一个模块需要注意的地方, 并不涉及单元测试和代码规范等。
前端开发果真是发展迅猛,刚享受到由模块化,组件化和单元测试带来的种种好处,又得迅速拥抱 Grunt, Gulp, Browserify, Webpack 这类自动化工具的变革。除了工具和生态圈,JavaScript 本身也在飞速发展着。ES2015(ES6) ,ES2016(ES7) ... 照这样的节奏,几乎是一年一个标准。标准多了,为解决兼容性的问题,竟也派生出了 源代码 和 编译 的概念。前端开发者通过语法糖、转化器、Polyfill 等,可以享受到标准乃至尚未定稿草案里的规范的便利,大幅提升开发效率。
至于这个模块本身,它的功能特别简单, 就是显示模块自身的的属性。
源代码
我们来编写组件 MyComponent.jsx ,放到项目的 src 目录下。
import React from 'react';
const MyComponent = props=> {
return <div>
props:
<pre>{JSON.stringify(props, null, 2)}</pre>
</div>
}
export default MyComponent;
关于各种文件放在哪里, 这里是我推荐的一些约定:
src 下用于存放源代码
lib 是编译后的代码,这个目录只读
所有包含 ES6 语法的文件名统一后缀为 .es6
所有包含 JSX 语法的文件后统一缀名为 .jsx
假设源代码里还有另外两个文件 foo.es6 和 bar.js,简化起见都丢到 src 的根目录下。
编译
为了把 ES6 代码编译成 ES5,需要安装 Babel,这个工具可以说野心极大,一次编译可以让 JavaScript 运行在所有地方。(听起来是不是有点 Java 的作风)
目前最常用的是 Babel5 版本,但是 Babel6 版本的设计更为精巧,已经非常推荐更新。也正是由于 Babel 有两个版本,所以开发过程中很有可能遇到这样的情况,
模块 A 的开发依赖于 Babel5 版本,而模块 B 依赖于 Babel6 版本。
解决这个问题最好的做法就是把 A 和 B 拆开,独立开发和发布。并且在发布到 NPM 的时候发布是的编译后的,也就是 ES5 版本的代码。
所以如果你的机器上的 babel 是全局安装的,是时候卸载它了,因为它的版本不是 5 就是 6 ,会导致一些不可预见的问题。
npm uninstall babel-cli --global
正确的安装方式是把 babel-cli 作为 develeopment 的依赖
npm install babel-cli --save-dev
使用的时候并不是直接调用全局的 Babel 而是调用依赖里的 Babel 可执行文件
./node_moles/.bin/babel
如果按照前文的约定来组织代码,src 目录结构看起来是这样的
src
├── bar.js
├── foo.es6
└── MyComponent.jsx
模块所有的代码都在一个目录下,这样编译过程就简单多了,两条命令就可以完成
./node_moles/.bin/rimraf lib
./node_moles/.bin/babel src ---files --source-maps --extensions .es6,.es,.jsx --out-dir lib
输出目录的结构
lib
├── bar.js
├── foo.js
├── foo.js.map
├── MyComponent.js
└── MyComponent.js.map
具体解释一下各个命令的作用:
第一条命令 ./node_moles/.bin/rimraf lib
作用 编译前清空之前的 lib 目录,这是一个好习惯,可以杜绝对 lib 下的文件的任何手动更改。
第二条命令
./node_moles/.bin/babel src --out-dir lib --source-maps --extensions .es6,.es,.jsx ---files
作用 遍历 src 目录下的文件,如果后缀名是 .es/.es6/.jsx 中的一种,就编译成 ES5,否则就直接拷贝到输出目录 lib 下
参数详解:
--out-dir lib 指定输出目录为 lib
--extensions .es6,.es,.jsx 指定需要编译的文件类型
---files 对于不需要编译的文件直接拷贝
--source-maps 生成 souce-map 文件
编译过程中还隐含了一个步骤就是加载 .babelrc 文件里的配置,该文件内容如下
{
"presets": [
"es2015",
"stage-0",
"react"
]
}
这是因为 Babel6 采用了插件化的设计,做到了灵活配置:如果要转换 JSX 语法文件,就加上 react 的 preset,同时项目依赖里要添加
babel-preset-react
npm install babel-preset-react --save-dev
样例代码
开发和调试 React 模块目前最好用的打包工具还是 Webpack,在项目跟目录下,新建一个 example 目录:
example/index.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Example</title>
</head>
<body></body>
<script src="bundle.js"></script>
</html>
example/src/index.jsx
import React from 'react';
import MyComponent,{foo,bar} from '../../';
import {render} from 'react-dom';
var element = document.createElement("div");
document.body.appendChild(element);
render(<MyComponent name="myComponent"/>, element);
webpack.config.js
var path = require('path');
mole.exports = {
entry: path.join(__dirname, 'example', 'src', 'index.jsx'),
output: {
filename: 'bundle.js'
},
mole: {
loaders: [{
test: /\.jsx$/,
loader: 'babel',
include: [
path.join(__dirname, 'example')
]
}]
},
devServer: {
contentBase: path.join(__dirname, 'example')
}
}
运行样例代码
./node_moles/.bin/webpack-dev-server
发布
发布前,还有一件事就是为你的模块添加一个入口文件 index.js
mole.exports = require('./lib/MyComponent');
exports.default = require('./lib/MyComponent');
exports.bar = require('./lib/bar');
exports.foo = require('./lib/foo');
接下来就是发布到 NPM 了。
npm publish
使用
别的开发者在使用你新发布的模块的时候可以这样导入
import MyComponent,{foo,bat} from 'react-component-example'
导入的直接是 ES5 代码,跳过编译从而避免了出现 Babel 版本不一致的问题,并且速度更快,是不是很棒!
不过假设你的模块包含很多组件,开发者可能只想用其中的一个或某几个,这时可以这样导入:
import MyComponent from 'react-component-example/src/MyComponent.jsx'
导入的是 ES6 代码,并且会被加入父级项目的编译过程。
㈥ vs code编写React,什么插件能做到输入标签名,然后按tab键就能自动展开
jQuery Tag标签输入插件 tagEditor是一款非常强大的tag标签编辑插件,能方便的创建出一个tab输入框,支持回车键输入tag,支持删除键删除tag,点击tag可再次编辑,结合jQuery UI autocomplete插件可实现下拉联想输入效果。
㈦ 如何合理布置React/Rex的目录结构
通常的情况是:写游戏的人非常容易接受React的模式,写服务器端的非常容易接受Angular的模式 但是两者相比React会更容易上手; 为啥ionic的项目用React就很难下手了? 因为之前ionic的各种组件都写好了呀,各种拼装就是了,而用React重构各种组。
㈧ react可以在eclipse操作么
react完全可以和jQuery,bootstrap等库整合使用,因为react本身就是js,js跟html和其他js当然能一起使用,react特殊的地方在于render()渲染方式的改变,生成一个虚拟dom,所以就有了5大类的生命周期,render里面的代码仍旧是纯html标签,跟最简单的那种写法是一样的,有id和class属性等。去找个简单的helloworld例子看一下代码结构就理解了
㈨ 如何合理布置React/Rex的目录结构
这种结构谐在让程序更容易扩展
├── src # 程序源文件
│ ├── main.js # 程序启动和渲染
│ ├── components # 全局可复用的表现组件(Presentational Components)
│ ├── containers # 全局可复用的容器组件
│ ├── layouts # 主页结构
│ ├── store # Rex指定块
│ │ ├── createStore.js # 创建和使用rex store
│ │ └── recers.js # Recer注册和注入
│ └── routes # 主路由和异步分割点
│ ├── index.js # 用store启动主程序路由
│ ├── Root.js # 为上下文providers包住组件
│ └── Home # 不规则路由
│ ├── index.js # 路由定义和代码异步分割
│ ├── assets # 组件引入的静态资源
│ ├── components # 直观React组件
│ ├── container # 连接actions和store
│ ├── moles # recers/constants/actions的集合
│ └── routes ** # 不规则子路由(** 可选择的)
routes 作为主入口。
export const createRoutes = (store) => ({
path: '/',
component: CoreLayout,
indexRoute: Home,
childRoutes: [
CounterRoute(store),
ZenRoute(store),
ElapseRoute(store),
RouteRoute(store),
PageNotFound(),
Redirect
]
})
一个Counter 模块包含了自身的assets,components,containers
Counter/
components/ # 页面的组件
containers/ # view 和 moles 数据对接
moles/ # 包含对应的 recer, action
index.js # 页面入口,定义path
index.js 自动的注入recer 到store,这样在顶层的store就无需要手动去整合每个模块自身的recer。代码如下:
// 导入对应的redicer
const recer = require('./moles/counter').default
/* Add the recer to the store on key 'counter' */
injectRecer(store, { key: 'counter', recer })