From 0a4e2673b257bccde740e4a49b8b8a82991c1f42 Mon Sep 17 00:00:00 2001 From: minwe Date: Wed, 28 Oct 2015 10:57:21 +0800 Subject: [PATCH] initial commit --- .editorconfig | 11 ++ .eslintrc | 45 +++++ .gitignore | 34 ++++ LICENSE | 22 +++ README.md | 65 +++++++ app/humans.txt | 14 ++ app/i/favicon.png | Bin 0 -> 1024 bytes app/i/logo.png | Bin 0 -> 1378 bytes app/i/touch/apple-touch-icon.png | Bin 0 -> 7422 bytes app/i/touch/chrome-touch-icon-192x192.png | Bin 0 -> 2852 bytes app/i/touch/icon-128x128.png | Bin 0 -> 2613 bytes .../ms-touch-icon-144x144-precomposed.png | Bin 0 -> 1942 bytes app/index.html | 52 ++++++ app/js/app.js | 73 ++++++++ app/js/pages/Index.js | 60 ++++++ app/js/pages/NotFound.js | 19 ++ app/js/pages/Page.js | 47 +++++ app/js/pages/Page1.js | 20 ++ app/js/pages/Page2.js | 39 ++++ app/manifest.json | 24 +++ app/manifest.webapp | 29 +++ app/robots.txt | 5 + app/style/app.scss | 1 + gulpfile.babel.js | 173 ++++++++++++++++++ package.json | 53 ++++++ 25 files changed, 786 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100755 app/humans.txt create mode 100755 app/i/favicon.png create mode 100755 app/i/logo.png create mode 100755 app/i/touch/apple-touch-icon.png create mode 100755 app/i/touch/chrome-touch-icon-192x192.png create mode 100755 app/i/touch/icon-128x128.png create mode 100755 app/i/touch/ms-touch-icon-144x144-precomposed.png create mode 100755 app/index.html create mode 100755 app/js/app.js create mode 100644 app/js/pages/Index.js create mode 100644 app/js/pages/NotFound.js create mode 100644 app/js/pages/Page.js create mode 100644 app/js/pages/Page1.js create mode 100644 app/js/pages/Page2.js create mode 100755 app/manifest.json create mode 100755 app/manifest.webapp create mode 100755 app/robots.txt create mode 100755 app/style/app.scss create mode 100644 gulpfile.babel.js create mode 100644 package.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1e58587 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..2930fdd --- /dev/null +++ b/.eslintrc @@ -0,0 +1,45 @@ +{ + "extends": "airbnb", + "rules": { + /* JSX */ + "react/prop-types": [1, { + "ignore": ["className", "children"] + }], + "react/sort-comp": [ // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-comp.md + 2, + { + "order": [ + "lifecycle", + "/^on.+$/", + "/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/", + "everything-else", + "/^render.+$/", + "render" + ], + "groups": { + "lifecycle": [ + "displayName", + "mixins", + "propTypes", + "contextTypes", + "childContextTypes", + "statics", + "defaultProps", + "constructor", + "getDefaultProps", + "getInitialState", + "state", + "getChildContext", + "componentWillMount", + "componentDidMount", + "componentWillReceiveProps", + "shouldComponentUpdate", + "componentWillUpdate", + "componentDidUpdate", + "componentWillUnmount" + ] + } + } + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d75574 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Editor +.idea + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +dist diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..198c8c7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Amaze UI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..33c9f26 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# Amaze UI Touch Starter Kit + +Amaze UI Touch 快速上手套件,基于 React、Amaze UI Touch、React Router 及 Gulp 开发 SPA。 + +**套件中目前只包含客户部代码,亦未包含 Flux、Redux 等框架**。 + +## 目录结构 + +项目文件放在 `app` 目录下: + +``` +.app +├── humans.txt +├── i // 图片 +├── index.html // 入口 HTML +├── js // JS +├── style // 样式文件(编译任务中设置的是 Sass,可以自行改用其他) +├── manifest.json +├── manifest.webapp +└── robots.txt +``` + +## 使用说明 + +### 环境配置 + +- 安装 [Node.js](https://nodejs.org/en/download/) +- 模块编译环境配置:[点击查看](https://github.com/nodejs/node-gyp#installation) + +### 全局安装 gulp: + +``` +npm install gulp -g +``` + +### 安装开发依赖 + +1. 克隆或下载本项目代码; +2. 进入项目目录,执行 `npm install`; + +### 开发 + +``` +gulp +``` + +或者 + +``` +npm start +``` + +### 生产环境构建 + +设置 Node 环境变量为 `production` 后,HTML 中引用的 CSS 和 JS 会替换为 minify 的版本。 + +``` +NODE_ENV=production gulp build +``` + +**[fish](http://fishshell.com/)**: + +``` +env NODE_ENV=production gulp build +``` diff --git a/app/humans.txt b/app/humans.txt new file mode 100755 index 0000000..0481f94 --- /dev/null +++ b/app/humans.txt @@ -0,0 +1,14 @@ +# humanstxt.org/ +# The humans responsible & technology colophon + +# TEAM + + -- -- + +# THANKS + + + +# TECHNOLOGY COLOPHON + + HTML5, CSS3 diff --git a/app/i/favicon.png b/app/i/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..09581589c3c12aee04739f86e6aaf8291b8d928c GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/app/i/touch/chrome-touch-icon-192x192.png b/app/i/touch/chrome-touch-icon-192x192.png new file mode 100755 index 0000000000000000000000000000000000000000..e56a9f2de55c4975e9185faa7f06c31751441196 GIT binary patch literal 2852 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 O-|9m3q|`Zv?EedvrHViR literal 0 HcmV?d00001 diff --git a/app/i/touch/icon-128x128.png b/app/i/touch/icon-128x128.png new file mode 100755 index 0000000000000000000000000000000000000000..919d3fd69c60c4c6d169dda97860d421c1a68c3e GIT binary patch literal 2613 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 literal 0 HcmV?d00001 diff --git a/app/index.html b/app/index.html new file mode 100755 index 0000000..7bc9a60 --- /dev/null +++ b/app/index.html @@ -0,0 +1,52 @@ + + + + + + + + Amaze UI Touch Starter Kit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + diff --git a/app/js/app.js b/app/js/app.js new file mode 100755 index 0000000..a64bed1 --- /dev/null +++ b/app/js/app.js @@ -0,0 +1,73 @@ +import React from 'react'; +import { + render, +} from 'react-dom'; +import { + Router, + Route, + Link, + IndexRoute, +} from 'react-router'; +import { + Container, + TabBar, +} from 'amazeui-touch'; + +const App = React.createClass({ + render() { + const { + location, + params, + children, + ...props, + } = this.props; + const transition = children.props.transition || 'sfr'; + + return ( + + + {React.cloneElement(children, {key: location.key})} + + + + + + + + ); + }, +}); + +// Pages +import Index from './pages/Index'; +import Page from './pages/Page'; + +const routes = ( + + + + + + +); + +document.addEventListener('DOMContentLoaded', () => { + render(routes, document.getElementById('root')); +}); diff --git a/app/js/pages/Index.js b/app/js/pages/Index.js new file mode 100644 index 0000000..e2af923 --- /dev/null +++ b/app/js/pages/Index.js @@ -0,0 +1,60 @@ +import React from 'react'; +import { + Container, + List, + NavBar, + Group, + View, +} from 'amazeui-touch'; +import { + Link, +} from 'react-router'; + +const Index = React.createClass({ + getDefaultProps() { + return { + transition: 'rfr', + }; + }, + + renderItems() { + const pages = [ + 'Page1', + 'Page2', + ]; + + return pages.map((item, index) => { + return ( + + ); + }); + }, + + render() { + return ( + + + + + + {this.renderItems()} + + + + + ); + }, +}); + +export default Index; diff --git a/app/js/pages/NotFound.js b/app/js/pages/NotFound.js new file mode 100644 index 0000000..dae5198 --- /dev/null +++ b/app/js/pages/NotFound.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { + Container, + Group, +} from 'amazeui-touch'; + +const NotFound = React.createClass({ + render: function() { + return ( + + +

Oops, Not Found.

+
+
+ ); + }, +}); + +export default NotFound; diff --git a/app/js/pages/Page.js b/app/js/pages/Page.js new file mode 100644 index 0000000..10e9ef5 --- /dev/null +++ b/app/js/pages/Page.js @@ -0,0 +1,47 @@ +import React from 'react'; +import { + View, + NavBar, +} from 'amazeui-touch'; +import { + Link, +} from 'react-router'; + +const pages = { + Page1: require('./Page1'), + Page2: require('./Page2'), +}; +import NotFound from './NotFound'; + +const Page = React.createClass({ + render() { + let page = this.props.params.page; + + if (page) { + page = page.charAt(0).toUpperCase() + page.slice(1); + } + + const Component = pages[page] || NotFound; + const backNav = { + component: Link, + icon: 'left-nav', + title: '返回', + props: { + to: '/', + }, + }; + + return ( + + + + + ); + }, +}); + +export default Page; diff --git a/app/js/pages/Page1.js b/app/js/pages/Page1.js new file mode 100644 index 0000000..99202d8 --- /dev/null +++ b/app/js/pages/Page1.js @@ -0,0 +1,20 @@ +import React from 'react'; +import { + Container, + Group, +} from 'amazeui-touch'; + +const Page1 = React.createClass({ + render() { + return ( + + +

Page 1

+

页面内容

+
+
+ ); + }, +}); + +export default Page1; diff --git a/app/js/pages/Page2.js b/app/js/pages/Page2.js new file mode 100644 index 0000000..5c68a12 --- /dev/null +++ b/app/js/pages/Page2.js @@ -0,0 +1,39 @@ +import React from 'react'; +import { + Container, + Group, + Slider, +} from 'amazeui-touch'; + +const sliderIntance = ( + + + + + + + + + + + + + +); + +const Page2 = React.createClass({ + render() { + return ( + + + {sliderIntance} + + + ); + }, +}); + +export default Page2; diff --git a/app/manifest.json b/app/manifest.json new file mode 100755 index 0000000..2f02829 --- /dev/null +++ b/app/manifest.json @@ -0,0 +1,24 @@ +{ + "name": "Amaze UI Touch Starter Kit", + "short_name": "AMTSK", + "icons": [ + { + "src": "i/touch/icon-128x128.png", + "sizes": "128x128" + }, + { + "src": "i/touch/apple-touch-icon.png", + "sizes": "152x152" + }, + { + "src": "i/touch/ms-touch-icon-144x144-precomposed.png", + "sizes": "144x144" + }, + { + "src": "i/touch/chrome-touch-icon-192x192.png", + "sizes": "192x192" + } + ], + "start_url": "/index.html?homescreen=1", + "display": "standalone" +} diff --git a/app/manifest.webapp b/app/manifest.webapp new file mode 100755 index 0000000..0d3e772 --- /dev/null +++ b/app/manifest.webapp @@ -0,0 +1,29 @@ +{ + "version": "1.0.0", + "name": "Amaze UI Touch Starter Kit", + "launch_path": "/index.html", + "description": "An Amaze UI template that helps you build fast, modern mobile web apps.", + "icons": { + "128": "/i/touch/icon-128x128.png" + }, + "developer": { + "name": "", + "url": "" + }, + "installs_allowed_from": [ + "*" + ], + "default_locale": "zh_CN", + "permissions": { + }, + "locales": { + "en": { + "name": "Amaze UI React Starter Kit", + "description": "An Amaze UI React template that helps you build fast, modern mobile web apps.", + }, + "zh_CN": { + "name": "Amaze UI Touch 启动工具包", + "description": "Amaze UI Touch 新手入门快速上手工具包" + } + } +} diff --git a/app/robots.txt b/app/robots.txt new file mode 100755 index 0000000..d0e5f1b --- /dev/null +++ b/app/robots.txt @@ -0,0 +1,5 @@ +# www.robotstxt.org/ + +# Allow crawling of all content +User-agent: * +Disallow: diff --git a/app/style/app.scss b/app/style/app.scss new file mode 100755 index 0000000..08ac701 --- /dev/null +++ b/app/style/app.scss @@ -0,0 +1 @@ +// Your style here. diff --git a/gulpfile.babel.js b/gulpfile.babel.js new file mode 100644 index 0000000..dddb808 --- /dev/null +++ b/gulpfile.babel.js @@ -0,0 +1,173 @@ +/** + * Amaze UI Starter Kit + */ + +import gulp from 'gulp'; +import gulpLoadPlugins from 'gulp-load-plugins'; +import del from 'del'; +import runSequence from 'run-sequence'; +import browserSync from 'browser-sync'; +import browserify from 'browserify'; +import watchify from 'watchify'; +import source from 'vinyl-source-stream'; +import buffer from 'vinyl-buffer'; + +const $ = gulpLoadPlugins(); +const isProduction = process.env.NODE_ENV === "production"; + +const AUTOPREFIXER_BROWSERS = [ + 'ie >= 10', + 'ie_mob >= 10', + 'ff >= 40', + 'chrome >= 40', + 'safari >= 7', + 'opera >= 23', + 'ios >= 7', + 'android >= 2.3', + 'bb >= 10' +]; + +const paths = { + dist: { + base: 'dist', + js: 'dist/js', + css: 'dist/css', + i: 'dist/i', + fonts: 'dist/css/fonts' + } +}; + +// JavaScript 格式校验 +gulp.task('jshint', () => { + return gulp.src('app/js/**/*.js') + .pipe($.eslint()) + .pipe($.eslint.format()); + // .pipe($.eslint.failOnError()); +}); + +// 图片优化 +gulp.task('images', () => { + return gulp.src('app/i/**/*') + .pipe($.cache($.imagemin({ + progressive: true, + interlaced: true + }))) + .pipe(gulp.dest(paths.dist.i)) + .pipe($.size({title: 'images'})); +}); + +// 拷贝相关资源 +gulp.task('copy', () => { + return gulp.src([ + 'app/*', + '!app/*.html', + '!app/js', + '!app/style', + '!app/i', + 'node_modules/amazeui-touch/dist/amazeui.touch.min.css', + 'node_modules/amazeui-touch/dist/fonts/*' + ], { + dot: true + }).pipe(gulp.dest(function(file) { + var filePath = file.path.toLowerCase(); + if (filePath.indexOf('.css') > -1) { + return paths.dist.css; + } else if (filePath.indexOf('ratchicons') > -1) { + return paths.dist.fonts; + } + return paths.dist.base; + })) + .pipe($.size({title: 'copy'})); +}); + +// 编译 Sass,添加浏览器前缀 +gulp.task('styles', () => { + return gulp.src(['app/style/app.scss']) + .pipe($.sass({ + outputStyle: 'expanded' + }).on('error', $.sass.logError)) + .pipe($.autoprefixer({browsers: AUTOPREFIXER_BROWSERS})) + .pipe(gulp.dest('dist/css')) + .pipe($.csso()) + .pipe($.rename({suffix: '.min'})) + .pipe(gulp.dest('dist/css')) + .pipe($.size({title: 'styles'})); +}); + +// 打包 Common JS 模块 +var b = browserify({ + cache: {}, + packageCache: {}, + entries: ['./app/js/app.js'], + debug: !isProduction, + transform: ['babelify'] +}); + +if (!isProduction) { + b = watchify(b); +} + +var bundle = function() { + var s = ( + b.bundle() + .on('error', $.util.log.bind($.util, 'Browserify Error')) + .pipe(source('app.js')) + .pipe(buffer()) + .pipe(gulp.dest(paths.dist.js)) + .pipe($.size({title: 'script'})) + ); + + return !isProduction ? s : s.pipe($.uglify()) + .pipe($.rename({suffix: '.min'})) + .pipe(gulp.dest(paths.dist.js)) + .pipe($.size({ + title: 'script minify' + })); +}; + +gulp.task('browserify', function() { + if (!isProduction) { + b.on('update', bundle).on('log', $.util.log); + } + + return bundle(); +}); + +// 压缩 HTML +gulp.task('html', () => { + return gulp.src('app/**/*.html') + .pipe($.minifyHtml()) + .pipe($.replace(/\{\{__VERSION__\}\}/g, isProduction ? '.min' : '')) + .pipe(gulp.dest('dist')) + .pipe($.size({title: 'html'})); +}); + +// 洗刷刷 +gulp.task('clean', function() { + return del(['dist/*', '!dist/.git'], {dot: true}); +}); + +// 监视源文件变化自动cd编译 +gulp.task('watch', function() { + gulp.watch('app/**/*.html', ['html']); + gulp.watch('app/less/**/*less', ['styles']); + gulp.watch('app/i/**/*', ['images']); + gulp.watch('app/js/**/*', ['jshint']); +}); + +// 启动预览服务,并监视 Dist 目录变化自动刷新浏览器 +gulp.task('default', ['build', 'watch'], () => { + let bs = browserSync.create(); + + bs.init({ + notify: false, + logPrefix: 'AMT', + server: ['dist'] + }); + + gulp.watch(['dist/**/*'], bs.reload); +}); + +gulp.task('build', function (cb) { + runSequence('clean', ['styles', 'jshint', 'html', 'images', 'copy', 'browserify'], cb); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..9597dc5 --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "react-starter-kit", + "private": true, + "version": "0.0.0", + "description": "Amaze UI Touch Starter Kit", + "repository": "https://github.com/amazeui/amt-starter-kit", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + }, + "dependencies": {}, + "devDependencies": { + "amazeui-touch": "latest", + "babel": "^5.8.29", + "babel-eslint": "^3.1.30", + "babelify": "^6.4.0", + "browser-sync": "^2.9.11", + "browserify": "^11.2.0", + "del": "^2.0.2", + "eslint": "^1.7.3", + "eslint-config-airbnb": "^0.1.0", + "eslint-plugin-react": "^3.6.3", + "gulp": "^3.9.0", + "gulp-autoprefixer": "^3.0.2", + "gulp-cache": "^0.2.9", + "gulp-concat": "^2.5.2", + "gulp-csso": "^1.0.0", + "gulp-eslint": "^1.0.0", + "gulp-imagemin": "^2.0.0", + "gulp-load-plugins": "^0.10.0", + "gulp-minify-html": "0.1.5", + "gulp-plumber": "^1.0.1", + "gulp-rename": "^1.2.2", + "gulp-replace": "^0.5.3", + "gulp-sass": "^2.0.4", + "gulp-size": "^1.0.0", + "gulp-sourcemaps": "^1.3.0", + "gulp-uglify": "^1.4.1", + "gulp-util": "^3.0.6", + "react": "^0.14.0", + "react-dom": "^0.14.0", + "react-router": "^1.0.0-rc3", + "run-sequence": "^1.0.1", + "vinyl-buffer": "^1.0.0", + "vinyl-source-stream": "^1.1.0", + "watchify": "^3.4.1" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "gulp", + "build": "build" + } +}