├── README.md
├── React 練習案例
└── README.md
├── ReactNative 第二篇 練習狂想曲
└── README.md
├── ReactNative 練習案例
└── README.md
├── ReactWeb 練習案例
├── day1
│ ├── .babelrc
│ ├── .editorconfig
│ ├── .eslintrc
│ ├── .gitignore
│ ├── .yo-rc.json
│ ├── README.md
│ ├── cfg
│ │ ├── base.js
│ │ ├── defaults.js
│ │ ├── dev.js
│ │ ├── dist.js
│ │ └── test.js
│ ├── dist
│ │ └── README.md
│ ├── karma.conf.js
│ ├── package.json
│ ├── server.js
│ ├── src
│ │ ├── actions
│ │ │ └── README.md
│ │ ├── components
│ │ │ └── Main.js
│ │ ├── config
│ │ │ ├── README.md
│ │ │ ├── base.js
│ │ │ ├── dev.js
│ │ │ ├── dist.js
│ │ │ └── test.js
│ │ ├── favicon.ico
│ │ ├── images
│ │ │ └── yeoman.png
│ │ ├── index.html
│ │ ├── index.js
│ │ ├── sources
│ │ │ └── README.md
│ │ ├── stores
│ │ │ └── README.md
│ │ └── styles
│ │ │ └── App.css
│ ├── test
│ │ ├── actions
│ │ │ └── .keep
│ │ ├── components
│ │ │ └── MainTest.js
│ │ ├── config
│ │ │ └── ConfigTest.js
│ │ ├── helpers
│ │ │ └── shallowRenderHelper.js
│ │ ├── loadtests.js
│ │ ├── sources
│ │ │ └── .keep
│ │ └── stores
│ │ │ └── .keep
│ └── webpack.config.js
└── day2
│ └── mytest
│ ├── .gitignore
│ ├── gulpfile.js
│ ├── package.json
│ └── src
│ ├── app.jsx
│ ├── helpers.js
│ ├── index.html
│ ├── pages
│ └── HomePage
│ │ ├── __tests__
│ │ └── index.js
│ │ ├── index.js
│ │ └── style.less
│ └── style
│ ├── README.md
│ └── main.less
├── Reactjs 第一篇 攻略篇
└── README.md
├── 其他線上讀書會
└── README.md
├── 讀書會注意事項
└── README.md
└── 讀書會過往影片及討論區
└── README.md
/README.md:
--------------------------------------------------------------------------------
1 | # 歡迎大家加入線上reactjs讀書會
2 |
3 | ## [讀書會注意事項](https://github.com/onlinereadbook/bookreactjs/tree/master/%E8%AE%80%E6%9B%B8%E6%9C%83%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85)
4 |
5 | ## [讀書會過往影片及討論區](https://github.com/onlinereadbook/bookreactjs/tree/master/%E8%AE%80%E6%9B%B8%E6%9C%83%E9%81%8E%E5%BE%80%E5%BD%B1%E7%89%87%E5%8F%8A%E8%A8%8E%E8%AB%96%E5%8D%80)
6 |
7 | ## [其他線上讀書會](https://github.com/onlinereadbook/bookreactjs/tree/master/其他線上讀書會)
8 |
9 | ## [主線攻略JsonGithubTodoList](http://goo.gl/VxQ0ab)
10 |
11 | ---
12 |
13 | ## 常用工具
14 |
15 | - [HackMD - jacky大教學](https://www.youtube.com/watch?v=8maKJ6CJ9no)
16 |
17 | ## 會友幫幫忙活動
18 |
19 | ```
20 | 遇到問題社團上無法解開時, 可聯絡版主招開幫幫忙活動
21 |
22 | 苦主要先講解目前製作寫程式的過程, 讓大家進入狀況後一起攻略問題
23 |
24 | 一方面讓會友知道業界的開發流程levelup, 另一方面也可以攻略問題
25 | ```
26 | ## Redux 相關
27 |
28 | ### Redux Saga 資源 :
29 |
30 | 1. [官方英文文檔](https://goo.gl/842OA0)
31 |
32 | 2. [官方中文文檔](https://goo.gl/C8lJRy)
33 |
34 | 3. [Saga Pattern 在前端的應用](https://goo.gl/SeSJDc)
35 |
36 | 4. [Handling async in Redux with Sagas](https://goo.gl/RFN4vH)
37 |
38 | 5. [Build an Image Gallery Using React, Redux and redux-saga](https://goo.gl/40e2e1)
39 |
40 | 6. [Using redux-saga To Simplify Your Codebase](https://goo.gl/Kkf3fy)
41 |
42 | 7. [Using redux-saga To Simplify Your Codebase 中文版](https://goo.gl/T9JdqY)
43 |
44 | 8. [redux-sagaで非同期処理と戦う (日文)](https://goo.gl/NPyYsE)
45 |
46 | ### 補充 :
47 |
48 | 1. [Generator 函数](https://goo.gl/jkJ1TF)
49 |
50 | ## 願望清單
51 |
52 | - * 有想聽的主題一樣開Issues 會幫忙試試看去邀約
53 |
--------------------------------------------------------------------------------
/React 練習案例/README.md:
--------------------------------------------------------------------------------
1 | # React 練習案例
2 |
3 | | 練習 | 解答 |
4 | | ----- | ----- |
5 | | [Level 24. 讓 React 應用連結 Redux 系統](https://goo.gl/P58rVn) | [傳送門](https://goo.gl/jLq5CP) |
6 |
--------------------------------------------------------------------------------
/ReactNative 第二篇 練習狂想曲/README.md:
--------------------------------------------------------------------------------
1 | # 神秘CC ReactNative 練習狂想曲
2 |
3 | B組是攻略
4 |
--------------------------------------------------------------------------------
/ReactNative 練習案例/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onlinereadbook/bookreactjs/40b3b073dc8b9d8c645a08481e4d3d6600c0016c/ReactNative 練習案例/README.md
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "es2015",
4 | "stage-0",
5 | "react"
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "parser": "babel-eslint",
3 | "plugins": [
4 | "react"
5 | ],
6 | "parserOptions": {
7 | "ecmaVersion": 6,
8 | "sourceType": "module",
9 | "ecmaFeatures": {
10 | "jsx": true
11 | }
12 | },
13 | "env": {
14 | "browser": true,
15 | "amd": true,
16 | "es6": true,
17 | "node": true,
18 | "mocha": true
19 | },
20 | "rules": {
21 | "comma-dangle": 1,
22 | "quotes": [ 1, "single" ],
23 | "no-undef": 1,
24 | "global-strict": 0,
25 | "no-extra-semi": 1,
26 | "no-underscore-dangle": 0,
27 | "no-console": 1,
28 | "no-unused-vars": 1,
29 | "no-trailing-spaces": [1, { "skipBlankLines": true }],
30 | "no-unreachable": 1,
31 | "no-alert": 0,
32 | "react/jsx-uses-react": 1,
33 | "react/jsx-uses-vars": 1
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # node-waf configuration
20 | .lock-wscript
21 |
22 | # Compiled binary addons (http://nodejs.org/api/addons.html)
23 | build/Release
24 |
25 | # Dependency directory
26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
27 | node_modules
28 |
29 | # Bower
30 | bower_components/
31 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/.yo-rc.json:
--------------------------------------------------------------------------------
1 | {
2 | "generator-react-webpack": {}
3 | }
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/README.md:
--------------------------------------------------------------------------------
1 |
2 | 新增兩個全域指令
3 | npm install -g yo
4 | npm install -g generator-react-webpack
5 | 在進入專案目錄
6 | mkdir my-new-project && cd my-new-project
7 | 使用yo react-webpack
8 | yo react-webpack
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/cfg/base.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | let path = require('path');
3 | let defaultSettings = require('./defaults');
4 |
5 | // Additional npm or bower modules to include in builds
6 | // Add all foreign plugins you may need into this array
7 | // @example:
8 | // let npmBase = path.join(__dirname, '../node_modules');
9 | // let additionalPaths = [ path.join(npmBase, 'react-bootstrap') ];
10 | let additionalPaths = [];
11 |
12 | module.exports = {
13 | additionalPaths: additionalPaths,
14 | port: defaultSettings.port,
15 | debug: true,
16 | devtool: 'eval',
17 | output: {
18 | path: path.join(__dirname, '/../dist/assets'),
19 | filename: 'app.js',
20 | publicPath: defaultSettings.publicPath
21 | },
22 | devServer: {
23 | contentBase: './src/',
24 | historyApiFallback: true,
25 | hot: true,
26 | port: defaultSettings.port,
27 | publicPath: defaultSettings.publicPath,
28 | noInfo: false
29 | },
30 | resolve: {
31 | extensions: ['', '.js', '.jsx'],
32 | alias: {
33 | actions: `${defaultSettings.srcPath}/actions/`,
34 | components: `${defaultSettings.srcPath}/components/`,
35 | sources: `${defaultSettings.srcPath}/sources/`,
36 | stores: `${defaultSettings.srcPath}/stores/`,
37 | styles: `${defaultSettings.srcPath}/styles/`,
38 | config: `${defaultSettings.srcPath}/config/` + process.env.REACT_WEBPACK_ENV
39 | }
40 | },
41 | module: {}
42 | };
43 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/cfg/defaults.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Function that returns default values.
3 | * Used because Object.assign does a shallow instead of a deep copy.
4 | * Using [].push will add to the base array, so a require will alter
5 | * the base array output.
6 | */
7 | 'use strict';
8 |
9 | const path = require('path');
10 | const srcPath = path.join(__dirname, '/../src');
11 | const dfltPort = 8000;
12 |
13 | /**
14 | * Get the default modules object for webpack
15 | * @return {Object}
16 | */
17 | function getDefaultModules() {
18 | return {
19 | preLoaders: [
20 | {
21 | test: /\.(js|jsx)$/,
22 | include: srcPath,
23 | loader: 'eslint-loader'
24 | }
25 | ],
26 | loaders: [
27 | {
28 | test: /\.css$/,
29 | loader: 'style-loader!css-loader'
30 | },
31 | {
32 | test: /\.sass/,
33 | loader: 'style-loader!css-loader!sass-loader?outputStyle=expanded&indentedSyntax'
34 | },
35 | {
36 | test: /\.scss/,
37 | loader: 'style-loader!css-loader!sass-loader?outputStyle=expanded'
38 | },
39 | {
40 | test: /\.less/,
41 | loader: 'style-loader!css-loader!less-loader'
42 | },
43 | {
44 | test: /\.styl/,
45 | loader: 'style-loader!css-loader!stylus-loader'
46 | },
47 | {
48 | test: /\.(png|jpg|gif|woff|woff2)$/,
49 | loader: 'url-loader?limit=8192'
50 | },
51 | {
52 | test: /\.(mp4|ogg|svg)$/,
53 | loader: 'file-loader'
54 | }
55 | ]
56 | };
57 | }
58 |
59 | module.exports = {
60 | srcPath: srcPath,
61 | publicPath: '/assets/',
62 | port: dfltPort,
63 | getDefaultModules: getDefaultModules
64 | };
65 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/cfg/dev.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | let path = require('path');
4 | let webpack = require('webpack');
5 | let baseConfig = require('./base');
6 | let defaultSettings = require('./defaults');
7 |
8 | // Add needed plugins here
9 | let BowerWebpackPlugin = require('bower-webpack-plugin');
10 |
11 | let config = Object.assign({}, baseConfig, {
12 | entry: [
13 | 'webpack-dev-server/client?http://127.0.0.1:' + defaultSettings.port,
14 | 'webpack/hot/only-dev-server',
15 | './src/index'
16 | ],
17 | cache: true,
18 | devtool: 'eval-source-map',
19 | plugins: [
20 | new webpack.HotModuleReplacementPlugin(),
21 | new webpack.NoErrorsPlugin(),
22 | new BowerWebpackPlugin({
23 | searchResolveModulesDirectories: false
24 | })
25 | ],
26 | module: defaultSettings.getDefaultModules()
27 | });
28 |
29 | // Add needed loaders to the defaults here
30 | config.module.loaders.push({
31 | test: /\.(js|jsx)$/,
32 | loader: 'react-hot!babel-loader',
33 | include: [].concat(
34 | config.additionalPaths,
35 | [ path.join(__dirname, '/../src') ]
36 | )
37 | });
38 |
39 | module.exports = config;
40 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/cfg/dist.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | let path = require('path');
4 | let webpack = require('webpack');
5 |
6 | let baseConfig = require('./base');
7 | let defaultSettings = require('./defaults');
8 |
9 | // Add needed plugins here
10 | let BowerWebpackPlugin = require('bower-webpack-plugin');
11 |
12 | let config = Object.assign({}, baseConfig, {
13 | entry: path.join(__dirname, '../src/index'),
14 | cache: false,
15 | devtool: 'sourcemap',
16 | plugins: [
17 | new webpack.optimize.DedupePlugin(),
18 | new webpack.DefinePlugin({
19 | 'process.env.NODE_ENV': '"production"'
20 | }),
21 | new BowerWebpackPlugin({
22 | searchResolveModulesDirectories: false
23 | }),
24 | new webpack.optimize.UglifyJsPlugin(),
25 | new webpack.optimize.OccurenceOrderPlugin(),
26 | new webpack.optimize.AggressiveMergingPlugin(),
27 | new webpack.NoErrorsPlugin()
28 | ],
29 | module: defaultSettings.getDefaultModules()
30 | });
31 |
32 | // Add needed loaders to the defaults here
33 | config.module.loaders.push({
34 | test: /\.(js|jsx)$/,
35 | loader: 'babel',
36 | include: [].concat(
37 | config.additionalPaths,
38 | [ path.join(__dirname, '/../src') ]
39 | )
40 | });
41 |
42 | module.exports = config;
43 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/cfg/test.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | let path = require('path');
4 | let srcPath = path.join(__dirname, '/../src/');
5 |
6 | let baseConfig = require('./base');
7 |
8 | // Add needed plugins here
9 | let BowerWebpackPlugin = require('bower-webpack-plugin');
10 |
11 | module.exports = {
12 | devtool: 'eval',
13 | module: {
14 | preLoaders: [
15 | {
16 | test: /\.(js|jsx)$/,
17 | loader: 'isparta-instrumenter-loader',
18 | include: [
19 | path.join(__dirname, '/../src')
20 | ]
21 | }
22 | ],
23 | loaders: [
24 | {
25 | test: /\.(png|jpg|gif|woff|woff2|css|sass|scss|less|styl)$/,
26 | loader: 'null-loader'
27 | },
28 | {
29 | test: /\.(js|jsx)$/,
30 | loader: 'babel-loader',
31 | include: [].concat(
32 | baseConfig.additionalPaths,
33 | [
34 | path.join(__dirname, '/../src'),
35 | path.join(__dirname, '/../test')
36 | ]
37 | )
38 | }
39 | ]
40 | },
41 | resolve: {
42 | extensions: [ '', '.js', '.jsx' ],
43 | alias: {
44 | actions: srcPath + 'actions/',
45 | helpers: path.join(__dirname, '/../test/helpers'),
46 | components: srcPath + 'components/',
47 | sources: srcPath + 'sources/',
48 | stores: srcPath + 'stores/',
49 | styles: srcPath + 'styles/',
50 | config: srcPath + 'config/' + process.env.REACT_WEBPACK_ENV
51 | }
52 | },
53 | plugins: [
54 | new BowerWebpackPlugin({
55 | searchResolveModulesDirectories: false
56 | })
57 | ]
58 | };
59 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/dist/README.md:
--------------------------------------------------------------------------------
1 | # About the dist folder
2 | After building the dist version of your project, the generated files are stored in this folder. You should keep it under version control.
3 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/karma.conf.js:
--------------------------------------------------------------------------------
1 | var webpackCfg = require('./webpack.config');
2 |
3 | // Set node environment to testing
4 | process.env.NODE_ENV = 'test';
5 |
6 | module.exports = function(config) {
7 | config.set({
8 | basePath: '',
9 | browsers: [ 'PhantomJS' ],
10 | files: [
11 | 'test/loadtests.js'
12 | ],
13 | port: 8000,
14 | captureTimeout: 60000,
15 | frameworks: [ 'mocha', 'chai' ],
16 | client: {
17 | mocha: {}
18 | },
19 | singleRun: true,
20 | reporters: [ 'mocha', 'coverage' ],
21 | preprocessors: {
22 | 'test/loadtests.js': [ 'webpack', 'sourcemap' ]
23 | },
24 | webpack: webpackCfg,
25 | webpackServer: {
26 | noInfo: true
27 | },
28 | coverageReporter: {
29 | dir: 'coverage/',
30 | reporters: [
31 | { type: 'html' },
32 | { type: 'text' }
33 | ]
34 | }
35 | });
36 | };
37 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "version": "0.0.1",
4 | "description": "YOUR DESCRIPTION - Generated by generator-react-webpack",
5 | "main": "",
6 | "scripts": {
7 | "clean": "rimraf dist/*",
8 | "copy": "copyfiles -f ./src/index.html ./src/favicon.ico ./dist",
9 | "dist": "npm run copy & webpack --env=dist",
10 | "lint": "eslint ./src",
11 | "posttest": "npm run lint",
12 | "release:major": "npm version major && npm publish && git push --follow-tags",
13 | "release:minor": "npm version minor && npm publish && git push --follow-tags",
14 | "release:patch": "npm version patch && npm publish && git push --follow-tags",
15 | "serve": "node server.js --env=dev",
16 | "serve:dist": "node server.js --env=dist",
17 | "start": "node server.js --env=dev",
18 | "test": "karma start",
19 | "test:watch": "karma start --autoWatch=true --singleRun=false"
20 | },
21 | "repository": "",
22 | "keywords": [],
23 | "author": "Your name here",
24 | "devDependencies": {
25 | "babel-core": "^6.0.0",
26 | "babel-eslint": "^6.0.0",
27 | "babel-loader": "^6.0.0",
28 | "babel-polyfill": "^6.3.14",
29 | "babel-preset-es2015": "^6.0.15",
30 | "babel-preset-react": "^6.0.15",
31 | "babel-preset-stage-0": "^6.5.0",
32 | "bower-webpack-plugin": "^0.1.9",
33 | "chai": "^3.2.0",
34 | "copyfiles": "^1.0.0",
35 | "css-loader": "^0.23.0",
36 | "eslint": "^3.0.0",
37 | "eslint-loader": "^1.0.0",
38 | "eslint-plugin-react": "^6.0.0",
39 | "file-loader": "^0.9.0",
40 | "glob": "^7.0.0",
41 | "isparta-instrumenter-loader": "^1.0.0",
42 | "karma": "^1.0.0",
43 | "karma-chai": "^0.1.0",
44 | "karma-coverage": "^1.0.0",
45 | "karma-mocha": "^1.0.0",
46 | "karma-mocha-reporter": "^2.0.0",
47 | "karma-phantomjs-launcher": "^1.0.0",
48 | "karma-sourcemap-loader": "^0.3.5",
49 | "karma-webpack": "^1.7.0",
50 | "minimist": "^1.2.0",
51 | "mocha": "^3.0.0",
52 | "null-loader": "^0.1.1",
53 | "open": "0.0.5",
54 | "phantomjs-prebuilt": "^2.0.0",
55 | "react-addons-test-utils": "^15.0.0",
56 | "react-hot-loader": "^1.2.9",
57 | "rimraf": "^2.4.3",
58 | "style-loader": "^0.13.0",
59 | "url-loader": "^0.5.6",
60 | "webpack": "^1.12.0",
61 | "webpack-dev-server": "^1.12.0"
62 | },
63 | "dependencies": {
64 | "core-js": "^2.0.0",
65 | "normalize.css": "^4.0.0",
66 | "react": "^15.0.0",
67 | "react-dom": "^15.0.0"
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/server.js:
--------------------------------------------------------------------------------
1 | /*eslint no-console:0 */
2 | 'use strict';
3 | require('core-js/fn/object/assign');
4 | const webpack = require('webpack');
5 | const WebpackDevServer = require('webpack-dev-server');
6 | const config = require('./webpack.config');
7 | const open = require('open');
8 |
9 | new WebpackDevServer(webpack(config), config.devServer)
10 | .listen(config.port, 'localhost', (err) => {
11 | if (err) {
12 | console.log(err);
13 | }
14 | console.log('Listening at localhost:' + config.port);
15 | console.log('Opening your system browser...');
16 | open('http://localhost:' + config.port + '/webpack-dev-server/');
17 | });
18 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/actions/README.md:
--------------------------------------------------------------------------------
1 | # About this folder
2 | This folder will hold all of your **flux** actions if you are using flux.
3 | You can include actions into your components or stores like this:
4 |
5 | ```javascript
6 | let react = require('react/addons');
7 | let MyAction = require('actions/MyAction');
8 | class MyComponent extends React.Component {
9 | constructor(props) {
10 | super(props);
11 | MyAction.exampleMethod();
12 | }
13 | }
14 | ```
15 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/components/Main.js:
--------------------------------------------------------------------------------
1 | require('normalize.css/normalize.css');
2 | require('styles/App.css');
3 |
4 | import React from 'react';
5 |
6 | let yeomanImage = require('../images/yeoman.png');
7 |
8 | class AppComponent extends React.Component {
9 | render() {
10 | return (
11 |
12 |

13 |
Please edit src/components/Main.js
to get started!
14 |
15 | );
16 | }
17 | }
18 |
19 | AppComponent.defaultProps = {
20 | };
21 |
22 | export default AppComponent;
23 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/config/README.md:
--------------------------------------------------------------------------------
1 | # About this folder
2 | This folder holds configuration files for different environments.
3 | You can use it to provide your app with different settings based on the
4 | current environment, e.g. to configure different API base urls depending on
5 | whether your setup runs in dev mode or is built for distribution.
6 | You can include the configuration into your code like this:
7 |
8 | ```javascript
9 | let react = require('react/addons');
10 | let config = require('config');
11 | class MyComponent extends React.Component {
12 | constructor(props) {
13 | super(props);
14 | let currentAppEnv = config.appEnv;
15 | }
16 | }
17 | ```
18 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/config/base.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Settings configured here will be merged into the final config object.
4 | export default {
5 | }
6 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/config/dev.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | import baseConfig from './base';
4 |
5 | let config = {
6 | appEnv: 'dev' // feel free to remove the appEnv property here
7 | };
8 |
9 | export default Object.freeze(Object.assign({}, baseConfig, config));
10 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/config/dist.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | import baseConfig from './base';
4 |
5 | let config = {
6 | appEnv: 'dist' // feel free to remove the appEnv property here
7 | };
8 |
9 | export default Object.freeze(Object.assign({}, baseConfig, config));
10 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/config/test.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | import baseConfig from './base';
4 |
5 | let config = {
6 | appEnv: 'test' // don't remove the appEnv property here
7 | };
8 |
9 | export default Object.freeze(Object.assign(baseConfig, config));
10 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onlinereadbook/bookreactjs/40b3b073dc8b9d8c645a08481e4d3d6600c0016c/ReactWeb 練習案例/day1/src/favicon.ico
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/images/yeoman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onlinereadbook/bookreactjs/40b3b073dc8b9d8c645a08481e4d3d6600c0016c/ReactWeb 練習案例/day1/src/images/yeoman.png
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | React Webpack Template Title
6 |
7 |
8 |
9 |
10 |
11 | APPLICATION CONTENT
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/index.js:
--------------------------------------------------------------------------------
1 | import 'core-js/fn/object/assign';
2 | import React from 'react';
3 | import ReactDOM from 'react-dom';
4 | import App from './components/Main';
5 |
6 | // Render the main component into the dom
7 | ReactDOM.render(, document.getElementById('app'));
8 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/sources/README.md:
--------------------------------------------------------------------------------
1 | # About this folder
2 | This folder will hold all of your **flux** datasources.
3 | You can include them into your components or stores like this:
4 |
5 | ```javascript
6 | let react = require('react/addons');
7 | let MySource = require('sources/MyAction');
8 | class MyComponent extends React.Component {
9 | constructor(props) {
10 | super(props);
11 | MySource.getRemoteData();
12 | }
13 | }
14 | ```
15 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/stores/README.md:
--------------------------------------------------------------------------------
1 | # About this folder
2 | This folder will hold all of your **flux** stores.
3 | You can include them into your components like this:
4 |
5 | ```javascript
6 | let react = require('react/addons');
7 | let MyStore = require('stores/MyStore');
8 | class MyComponent extends React.Component {
9 | constructor(props) {
10 | super(props);
11 | MyStore.doSomething();
12 | }
13 | }
14 | ```
15 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/src/styles/App.css:
--------------------------------------------------------------------------------
1 | /* Base Application Styles */
2 | body {
3 | color: #fff;
4 | background: #222;
5 | }
6 |
7 | .index img {
8 | margin: 40px auto;
9 | border-radius: 4px;
10 | background: #fff;
11 | display: block;
12 | }
13 |
14 | .index .notice {
15 | margin: 20px auto;
16 | padding: 15px 0;
17 | text-align: center;
18 | border: 1px solid #000;
19 | border-width: 1px 0;
20 | background: #666;
21 | }
22 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/actions/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onlinereadbook/bookreactjs/40b3b073dc8b9d8c645a08481e4d3d6600c0016c/ReactWeb 練習案例/day1/test/actions/.keep
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/components/MainTest.js:
--------------------------------------------------------------------------------
1 | /*eslint-env node, mocha */
2 | /*global expect */
3 | /*eslint no-console: 0*/
4 | 'use strict';
5 |
6 | // Uncomment the following lines to use the react test utilities
7 | // import React from 'react/addons';
8 | // const TestUtils = React.addons.TestUtils;
9 | import createComponent from 'helpers/shallowRenderHelper';
10 |
11 | import Main from 'components/Main';
12 |
13 | describe('MainComponent', () => {
14 | let MainComponent;
15 |
16 | beforeEach(() => {
17 | MainComponent = createComponent(Main);
18 | });
19 |
20 | it('should have its component name as default className', () => {
21 | expect(MainComponent.props.className).to.equal('index');
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/config/ConfigTest.js:
--------------------------------------------------------------------------------
1 | /*eslint-env node, mocha */
2 | /*global expect */
3 | /*eslint no-console: 0*/
4 | 'use strict';
5 |
6 | import config from 'config';
7 |
8 | describe('appEnvConfigTests', () => {
9 | it('should load app config file depending on current --env', () => {
10 | expect(config.appEnv).to.equal('test');
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/helpers/shallowRenderHelper.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Function to get the shallow output for a given component
3 | * As we are using phantom.js, we also need to include the fn.proto.bind shim!
4 | *
5 | * @see http://simonsmith.io/unit-testing-react-components-without-a-dom/
6 | * @author somonsmith
7 | */
8 | import React from 'react';
9 | import TestUtils from 'react-addons-test-utils';
10 |
11 | /**
12 | * Get the shallow rendered component
13 | *
14 | * @param {Object} component The component to return the output for
15 | * @param {Object} props [optional] The components properties
16 | * @param {Mixed} ...children [optional] List of children
17 | * @return {Object} Shallow rendered output
18 | */
19 | export default function createComponent(component, props = {}, ...children) {
20 | const shallowRenderer = TestUtils.createRenderer();
21 | shallowRenderer.render(React.createElement(component, props, children.length > 1 ? children : children[0]));
22 | return shallowRenderer.getRenderOutput();
23 | }
24 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/loadtests.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | require('babel-polyfill');
4 | require('core-js/fn/object/assign');
5 |
6 | // Add support for all files in the test directory
7 | const testsContext = require.context('.', true, /(Test\.js$)|(Helper\.js$)/);
8 | testsContext.keys().forEach(testsContext);
9 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/sources/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onlinereadbook/bookreactjs/40b3b073dc8b9d8c645a08481e4d3d6600c0016c/ReactWeb 練習案例/day1/test/sources/.keep
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/test/stores/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onlinereadbook/bookreactjs/40b3b073dc8b9d8c645a08481e4d3d6600c0016c/ReactWeb 練習案例/day1/test/stores/.keep
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day1/webpack.config.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const path = require('path');
4 | const args = require('minimist')(process.argv.slice(2));
5 |
6 | // List of allowed environments
7 | const allowedEnvs = ['dev', 'dist', 'test'];
8 |
9 | // Set the correct environment
10 | let env;
11 | if (args._.length > 0 && args._.indexOf('start') !== -1) {
12 | env = 'test';
13 | } else if (args.env) {
14 | env = args.env;
15 | } else {
16 | env = 'dev';
17 | }
18 | process.env.REACT_WEBPACK_ENV = env;
19 |
20 | /**
21 | * Build the webpack configuration
22 | * @param {String} wantedEnv The wanted environment
23 | * @return {Object} Webpack config
24 | */
25 | function buildConfig(wantedEnv) {
26 | let isValid = wantedEnv && wantedEnv.length > 0 && allowedEnvs.indexOf(wantedEnv) !== -1;
27 | let validEnv = isValid ? wantedEnv : 'dev';
28 | let config = require(path.join(__dirname, 'cfg/' + validEnv));
29 | return config;
30 | }
31 |
32 | module.exports = buildConfig(env);
33 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/.gitignore:
--------------------------------------------------------------------------------
1 | # Build directory
2 | build
3 |
4 | # Copied styles for Material UI
5 | src/style/material-ui
6 |
7 | # OS X-specific file
8 | .DS_Store
9 |
10 | # Logs
11 | logs
12 | *.log
13 |
14 | # Runtime data
15 | pids
16 | *.pid
17 | *.seed
18 |
19 | # Dependency directory
20 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
21 | node_modules
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/gulpfile.js:
--------------------------------------------------------------------------------
1 | var gulp = require('gulp');
2 | var browserify = require('browserify');
3 | var del = require('del');
4 | var reactify = require('reactify');
5 | var source = require('vinyl-source-stream');
6 | var webserver = require('gulp-webserver');
7 | var less = require('gulp-less');
8 | var path = require('path');
9 | var rename = require('gulp-rename');
10 | var inject = require('gulp-inject');
11 | var runsequence = require('gulp-run-sequence');
12 | var ncp = require('ncp').ncp;
13 | var gutil = require('gulp-util');
14 |
15 | // Just some directories that we will be providing to `gulp.src` method calls.
16 | var paths = {
17 | less: ['src/**/*.less', 'src/**/**/*.less', '!src/{style,style/**}'],
18 | css: ['build/**/*.css', '!build/{style,style/**}'],
19 | globalcss: ['build/style/*.css'],
20 | style: ['src/style/*.less'],
21 | appjs: ['./src/app.jsx'],
22 | js: ['src/**/*.js'],
23 | indexhtml: ['./src/index.html']
24 | };
25 |
26 | // Here is where we will be sending all our files to.
27 | var destPath = './build'
28 |
29 | /*
30 | * Handles an error event.
31 | */
32 | function swallowError(error) {
33 | gutil.log(error.message);
34 | this.emit('end');
35 | }
36 |
37 | /*
38 | * Deletes the `build` folder.
39 | */
40 | gulp.task('clear-build', function (done) {
41 | del(['build'], done);
42 | });
43 |
44 | /*
45 | * Clears out all the stuff that have been generated during development.
46 | */
47 | gulp.task('clean', function(done) {
48 | return runsequence('clear-material', 'clear-build', done);
49 | });
50 |
51 | /*
52 | * Compiles all LESS style sheets that are "local" to specific modules.
53 | */
54 | gulp.task('less', function () {
55 | return gulp.src(paths.less)
56 | .pipe(less({
57 | paths: [ path.join(__dirname, 'src') ]
58 | }))
59 | .on('error', swallowError)
60 | .pipe(gulp.dest(destPath));
61 | });
62 |
63 | /*
64 | * Compiles the global styles (all written in LESS).
65 | */
66 | gulp.task('style', function () {
67 | return gulp.src(paths.style)
68 | .pipe(less({
69 | paths: [ path.join(__dirname, 'src', 'style') ]
70 | }))
71 | .on('error', swallowError)
72 | .pipe(gulp.dest(path.join(destPath, 'style')));
73 | });
74 |
75 | /*
76 | * Bundles the scripts, using Browserify.
77 | */
78 | gulp.task('js', function() {
79 | return browserify(paths.appjs)
80 | .transform(reactify)
81 | .bundle()
82 | .on('error', function (err) {
83 | gutil.log(err.message);
84 | this.emit('end');
85 | })
86 | .pipe(source('bundle.js'))
87 | .on('error', swallowError)
88 | .pipe(gulp.dest(destPath));
89 | });
90 |
91 | /*
92 | * Copies the index.html from the source directory to the build directory.
93 | */
94 | gulp.task('copy-index', function () {
95 | return gulp
96 | .src(paths.indexhtml)
97 | .pipe(gulp.dest(destPath));
98 | });
99 |
100 | /*
101 | * Injects the "global" styles.
102 | */
103 | gulp.task('inject-index', function () {
104 | return gulp
105 | .src([ path.join(destPath, 'index.html') ])
106 | .pipe(
107 | inject(
108 | gulp.src(paths.globalcss, {read: false}),
109 | {name: 'global', relative: true}
110 | )
111 | )
112 | .pipe(
113 | inject(gulp.src(paths.css, {read: false}), {relative: true})
114 | )
115 | .pipe(gulp.dest(destPath));
116 | });
117 |
118 | /*
119 | * Copies the index.html from the source directory to the build directory, and
120 | * injects link tags into the HTML.
121 | */
122 | gulp.task('index', function (done) {
123 | return runsequence('copy-index', 'inject-index', done);
124 | });
125 |
126 | /*
127 | * Compiles the global styles, local styles, and the JavaSript/JSX code, and
128 | * puts the compiled code into the `build` folder. Injects the necessary
129 | * dpeendencies into the HTML.
130 | */
131 | gulp.task('build', function (done) {
132 | return runsequence(
133 | 'clean',
134 | 'copy-material',
135 | ['style', 'less', 'js'],
136 | 'index',
137 | done
138 | );
139 | });
140 |
141 | /*
142 | * Compiles the local LESS styles and updates the index.
143 | */
144 | gulp.task('less-and-index', function (done) {
145 | return runsequence('less', 'index', done);
146 | });
147 |
148 | /*
149 | * Compiles the global LESS styles and updates the index.
150 | */
151 | gulp.task('style-and-index', function (done) {
152 | return runsequence('style', 'index', done);
153 | });
154 |
155 | /*
156 | * Watch for changes in files.
157 | */
158 | gulp.task('watch', function() {
159 | gulp.watch(paths.style, ['style-and-index']);
160 | gulp.watch(paths.less, ['less-and-index']);
161 | gulp.watch(paths.js.concat(paths.appjs), ['js']);
162 | gulp.watch(paths.indexhtml, ['index']);
163 | });
164 |
165 | /*
166 | * Run the server.
167 | */
168 | gulp.task('server', function () {
169 | return gulp.src(destPath)
170 | .pipe(webserver({
171 | livereload: true,
172 | open: true
173 | }));
174 | });
175 |
176 | /*
177 | * Deletes the `src/style/material-ui` folder.
178 | */
179 | gulp.task('clear-material', function (done) {
180 | del(['src/style/material-ui'], done);
181 | });
182 |
183 | /*
184 | * Copies the `material-ui` CSS (LESS) framework from the `node_modules` folder
185 | * without checking (and then deleting) for an exsting folder in the
186 | * destination.
187 | */
188 | gulp.task('copy-material-no-clear', function (done) {
189 | var source =
190 | path.join(__dirname, 'node_modules', 'material-ui', 'src', 'less');
191 | var dest = path.join(__dirname, 'src', 'style', 'material-ui');
192 | ncp(source, dest, done);
193 | });
194 |
195 | /*
196 | * Copies the `material-ui` CSS (LESS) framework from the `node_modules` folder,
197 | * assuming that it's been properly installed.
198 | */
199 | gulp.task('copy-material', function (done) {
200 | return runsequence('clear-material', 'copy-material-no-clear', done);
201 | });
202 |
203 | /*
204 | * The default is meant for development. Watches for changes, runs the builds,
205 | * and fires up a web server. Also opens a new browser tab to the application.
206 | */
207 | gulp.task('develop', function () {
208 | return runsequence('build', ['watch', 'server']);
209 | });
210 |
211 | /*
212 | * An alias to the `build` task.
213 | */
214 | gulp.task('default', ['build']);
215 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "scripts": {
3 | "server": "gulp develop",
4 | "test": "jest"
5 | },
6 | "devDependencies": {
7 | "browserify": "^6.3.3",
8 | "del": "^0.1.3",
9 | "gulp": "^3.8.10",
10 | "gulp-inject": "^1.0.2",
11 | "gulp-less": "^1.3.6",
12 | "gulp-rename": "^1.2.0",
13 | "gulp-run-sequence": "^0.3.2",
14 | "gulp-util": "^3.0.1",
15 | "gulp-webserver": "^0.8.7",
16 | "jest-cli": "^0.2.1",
17 | "ncp": "^1.0.1",
18 | "reactify": "^0.17.1",
19 | "vinyl-source-stream": "^1.0.0"
20 | },
21 | "dependencies": {
22 | "fluxxor": "^1.5.1",
23 | "material-ui": "^0.3.1",
24 | "react": "^0.12.1",
25 | "react-router": "^0.11.6",
26 | "react-tap-event-plugin": "^0.1.3"
27 | },
28 | "jest": {
29 | "unmockedModulePathPatterns": [
30 | "node_modules/fluxxor"
31 | ]
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/app.jsx:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Router = require('react-router');
3 | var mui = require('material-ui');
4 | var injectTapEventPlugin = require("react-tap-event-plugin");
5 |
6 | // A lot of the code is auto-generated. However, fiddling around with it
7 | // shouldn't be a catastrophic failure. Just that you'd need to know your way
8 | // around a little. However, **BE CAREFUL WHILE DELETING SOME OF THE COMMENTS IN
9 | // THIS FILE; THE AUTO-GENERATORS RELY ON SOME OF THEM**.
10 |
11 | // inject:pagerequire
12 | var HomePage = require('./pages/HomePage');
13 | // endinject
14 |
15 | var menuItems = [
16 | // inject:menuitems
17 | { payload: 'home', text: 'myapp' },
18 | // endinject
19 | ];
20 |
21 | var titles = {
22 | // inject:titles
23 | '/home': 'myapp',
24 | // endinject
25 | };
26 |
27 | var Route = Router.Route;
28 | var DefaultRoute = Router.DefaultRoute;
29 | var RouteHandler = Router.RouteHandler;
30 |
31 | var AppCanvas = mui.AppCanvas;
32 | var AppBar = mui.AppBar;
33 | var LeftNav = mui.LeftNav;
34 |
35 | injectTapEventPlugin();
36 |
37 | var LeftNavComponent = React.createClass({
38 | mixins: [Router.Navigation],
39 |
40 | render: function () {
41 | // Optionally, you may add a header to the left navigation bar, by setting
42 | // the `LeftNav`'s `header` property to a React component, like os:
43 | //
44 | // header={Header Title.
}
45 | return (
46 |
53 | );
54 | },
55 |
56 | toggle:function () {
57 | this.refs.leftNav.toggle();
58 | },
59 |
60 | close: function () {
61 | this.refs.leftNav.close()
62 | },
63 |
64 | _onLeftNavChange: function(e, selectedIndex, menuItem) {
65 | this.transitionTo(menuItem.payload);
66 | this.refs.leftNav.close();
67 | }
68 | });
69 |
70 | var Master = React.createClass({
71 | mixins: [Router.State],
72 |
73 | _onMenuIconButtonTouchTap: function () {
74 | this.refs.leftNav.toggle();
75 | },
76 | render: function () {
77 | return (
78 |
79 |
80 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 | );
95 | }
96 | });
97 |
98 | var routes = (
99 |
100 | {/* inject:route */}
101 |
102 | {/* endinject */}
103 |
104 |
105 | );
106 |
107 | Router.run(routes, function (Handler) {
108 | React.render(, document.body);
109 | });
110 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/helpers.js:
--------------------------------------------------------------------------------
1 | var Fluxxor = require('Fluxxor');
2 | var React = require('react');
3 |
4 | // Just a place to dump a few helpers.
5 |
6 | module.exports.FluxMixin = Fluxxor.FluxMixin(React);
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/index.html:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | myapp
10 |
11 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/pages/HomePage/__tests__/index.js:
--------------------------------------------------------------------------------
1 | .<%= className %>-page {
2 | // Feel free to add all your styles here.
3 | //
4 | // Since the styling language is not CSS, but LESS, you can nest all your
5 | // styles here. For more info on LESS, please refer to
6 | // http://lesscss.org/features/
7 | }
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/pages/HomePage/index.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | // If you are going to be using stores, be sure to first load in the `Fluxxor`
4 | // module.
5 | //
6 | // var Fluxxor = require('Fluxxor');
7 | //
8 | // If you want to leverage the use of stores, a suggestion would be to
9 | // initialize an object, and set it to a `stores` variable, and adding a new
10 | // instance of the store as a property to the object, like so:
11 | //
12 | // var stores = {
13 | // SomeStore: new SomeStore()
14 | // };
15 | //
16 | // And also, because we are using the Flux architecture, you may also initialize
17 | // an object full of methods that represent "actions" that will be called upon
18 | // by a "dispatcher", like so:
19 | //
20 | // var actions = {
21 | // doSomething: function (info) {
22 | // this.dispatch('DO_SOMETHING', {info: info});
23 | // }
24 | // };
25 | //
26 | // And finally, you would pass the stores and actions to our dispatcher, like
27 | // so:
28 | //
29 | // var flux = new Fluxxor.Flux(stores, actions);
30 | //
31 | // And, then, you would pass in the reference of your dispatcher to the view
32 | // relies on the dispatcher (that view is returned by the `render` method), like
33 | // so:
34 | //
35 | //
36 |
37 | module.exports = React.createClass({
38 | render: function () {
39 | return (
40 |
41 | myapp
42 |
43 | );
44 | }
45 |
46 | });
47 |
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/pages/HomePage/style.less:
--------------------------------------------------------------------------------
1 | .home-page {
2 | // Feel free to add all your styles here.
3 | //
4 | // Since the styling language is not CSS, but LESS, you can nest all your
5 | // styles here. For more info on LESS, please refer to
6 | // http://lesscss.org/features/
7 | }
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/style/README.md:
--------------------------------------------------------------------------------
1 | # Herein Lies The Global Styles
2 |
3 | All global styles (written using the [LESS](http://lesscss.org/) style language) shall be stored in this folder.
4 |
5 | Optionally, instead of creating new `.less` files, you may modify `main.less` directly. Just be sure to *only* add your LESS code where indicated.
6 |
7 | \* **Do not** change the contents of the `material-ui` folder. It's been automatically generated, and any changes to it will be undone!
--------------------------------------------------------------------------------
/ReactWeb 練習案例/day2/mytest/src/style/main.less:
--------------------------------------------------------------------------------
1 | @import "material-ui/scaffolding.less";
2 |
3 | // This is where you would optionally add your styles.
4 |
5 | // Feel free to leverage the styles below in order to implement the header in
6 | // the sidebar.
7 |
8 | // .logo {
9 | // cursor: pointer;
10 | // .mui-font-style-headline;
11 | // .mui-text-full-white;
12 | // line-height: @app-bar-height;
13 | // .mui-font-weight-light;
14 | // background-color: @primary-1-color;
15 | // padding-left: @desktop-gutter;
16 | // padding-top: 0;
17 | // margin-bottom: @desktop-gutter-mini;
18 | // }
19 |
20 | @import "material-ui/components.less";
--------------------------------------------------------------------------------
/Reactjs 第一篇 攻略篇/README.md:
--------------------------------------------------------------------------------
1 | #Reactjs 成長營故事篇 [每個連結都是歷史攻略影片歐]
2 |
3 |
4 | [因為有次看到了這篇](https://www.youtube.com/watch?v=sHsmh3eRP04)因緣際會讀書會就在於3月31日開跑,那時候剛好遇到[maoyang來邀請加入soft&share讀書會成員](https://github.com/orgs/softnshare/dashboard),也謝謝maoyang很熱心幫忙在各大社團幫忙招募會友
5 |
6 | [第一強棒 jacky很熱心分享了他的個人經驗,超強的這是我第一次認識到reactjs 感動到 ](http://www.slideshare.net/hungjie19/hello-reactjs-01-bulid-my-first-web-app)
7 |
8 | [之後在大家討論之餘jacky又跳出來講了如何用hackmd.io做簡報大家的眼睛就亮了起來,於是乎這段影片就變成了永恆的傳說,也讓之後大部分的主講都用這套來做silder](https://www.youtube.com/watch?v=8maKJ6CJ9no)
9 |
10 | [之後調查了許多讀書會要進行的方式,用書本用官網當教材,但大家意見不都不一致,這時候jason大大神人出現,給了我們一本武功秘笈,並快帶我跑了一次說真的那時候還看不懂>_<](https://github.com/shiningjason1989/react-quick-tutorial
11 | )
12 |
13 | 後來因為大家都是小菜菜,遇到了沒有人主講的囧境,這時候larry大大跳出幫忙連續基礎導讀後來還有allen大大也加入了導讀,口條好台風穩,經驗豐富有問必答神人啊,[後來這時候james提出了要先學會es6,大家也都很贊成所以就開了es6讀書會由james主持,一直並行到現在故事還在進行中](https://github.com/softnshare/es6),[larry把課程講完了但因為都是剛接觸有些不是很清楚,所以決定在來重新reload 在發射子彈一次
14 | ](https://www.facebook.com/groups/gruntjsTW/?fref=ts)
15 |
16 |
17 | [第二彈分AB兩組 A組進行基本入門B組直接由patten與redux相關進行 ,Allen大大很熱心的幫我們導讀A組 1-4 章 ](https://www.youtube.com/watch?v=EkjdBs1Fzeo&list=PLjCvPv97gItIvMkDEot1vYH6NmE6EwO56&index=1) [再加碼 第五章](https://www.youtube.com/watch?v=oJ6WZjFrUHc&list=PLjCvPv97gItIvMkDEot1vYH6NmE6EwO56&index=2) [與 B組的第一棒 直接帶入主題](https://www.youtube.com/watch?v=2cfMA0uDOYE&list=PLjCvPv97gItIvMkDEot1vYH6NmE6EwO56&index=3)
18 |
19 | 聽第二次的感覺就不太一樣這次有通透了一些但是es6部分還不是很了解
20 | 後來就去james主持的es6讀書會 聽了大神的主講
21 | 了解了基本的es6概念
22 |
23 | [後來默司也加入了6-7章導讀,默司是複製人嗎為什麼每個讀書會都有默司.詢問了一下原來默司表示有前端默司跟後端默司但共用一個身體 XD 挖哩勒,總之前端默司跟後端默司都很強拉
24 | ](https://www.facebook.com/mosluce/videos/10210633331609210/)
25 |
26 | [讀書會進行到這邊認識越來越多夥伴很高興可以走得這麼遠,這時候小當家說要煮菜給我們吃,很高興志芳幫忙導讀A組8-9章]
27 | (https://www.youtube.com/watch?v=6LbyW6xC8gM&feature=youtu.be)
28 |
29 | [B 組部分 13-16 章部分 james 重複講了兩次flux概念私下也有在實作一些技巧給朋友看
30 | ](https://youtu.be/RgB_2R8j3L8)
31 |
32 | [B 組 景泰也幫忙導讀了第18章]
33 | (https://www.youtube.com/watch?v=cv57Pbry_Ec
34 | )
35 | [並且補充了一些工具]
36 | (https://www.youtube.com/watch?v=qdUlfiDbCcI&feature=youtu.be)
37 |
38 | 之後因為有james 大大 有demo reactjs native 大家看了都流口水了,所以有趣邀請到 chunghe fang 大大 來講兩篇react-native
39 | [一篇是 實戰 - 鉅亨網 app](https://youtu.be/NEmQAC9IMLk)
40 | [簡報](https://docs.google.com/presentation/d/1F27AKUZMgoaenTz0xqRCaDp2rbWgjRRzMtAU8Ubm9t8/edit#slide=id.p)
41 |
42 | [另外一篇是react-native-svg/d3 分享]
43 | (https://youtu.be/qeB0pEIajbU)
44 | [簡報](https://github.com/chunghe/React-Native-Stock-Chart)
45 |
46 |
47 | [後來還有邀請到林楊興大大來講一篇Universal Rendering with React/Redux 用簡單的話語不多程式碼揭開神秘的面紗也更了解到Isomorphic是什麼了](https://youtu.be/xoMGdasN6cw)
48 |
49 |
50 | [A組由紀相安(就是我拉)幫大家攻略最終章終於攻略完畢複習了箭頭函數跟bind還有react元件週期method,恭喜大家都升為B或C組嚕](https://www.youtube.com/watch?v=1z7o9mHLrK0&feature=youtu.be)
51 |
52 | [緊接著由bruce幫大家講B組的flux 第17章節container的用法非常實用](https://www.youtube.com/watch?v=hxtU9-3ZaSU&feature=youtu.be)
53 |
54 | [B組allen攻略到redux第一章用他自己看過很多影片的最後歸納的心得來做分享,用自己的語言講解果然是讓大家最容易懂的,很讚的一篇](https://youtu.be/upq6WEAAE3Y)
55 |
56 | [番外篇 meteor 今天終於見識到meteor強大的火力,max 很精彩的主講閃到了大家的眼睛,講解了運作的方式也用live code 來帶大家走一遍, 難怪star這麼高 ,有機會的話一定要再邀請max 來第二彈 ,真是太精采拉](https://www.youtube.com/watch?v=HNEZ677A7eM)
57 | [武功祕笈silder在此](http://www.slideshare.net/MaxLi23/introduction-to-meteor-react)
58 |
59 | # react成長營故事歡迎大家一起來互通有無
60 |
--------------------------------------------------------------------------------
/其他線上讀書會/README.md:
--------------------------------------------------------------------------------
1 | # 其他線上讀書會
2 |
3 | ## 線上讀書會
4 |
5 | | | 讀書會 | 時間 |
6 | | ----- | ----- | :-----: |
7 | | 週一 | [線上reactjs 讀書會](https://www.facebook.com/groups/906048196159262/) | A組 - 20:00
B組 - 21:00 |
8 | | 週二 | [線上nodejs 讀書會 ](https://www.facebook.com/groups/207139586323090/) | 19:30 |
9 | | 週三 | [線上docker 讀書會 ](https://www.facebook.com/groups/750311598438135/) | 19:30 |
10 | | 週四 | [線上swift 讀書會](https://www.facebook.com/groups/238948643131478/) | 20:00 |
11 | | 週五 | [線上laravel 讀書會](https://www.facebook.com/groups/956973084383781/)
[線上 unity 讀書會](https://www.facebook.com/groups/1606498833013546/) | 19:30
19:30 |
12 |
13 | ## 友站讀書會
14 |
15 | - [早上讀書會 史丹佛 swift cs 193](https://www.facebook.com/groups/1623975731247820/)
16 | - [james的社團 ES6讀書會](https://www.facebook.com/groups/gruntjsTW/)
17 | - [台中前端社群](http://goo.gl/Re0s5a)
18 | - [新北創立坊](https://github.com/amazing-tutor/web-tutor-on-thursday)
19 | - [softnshare](softnshare.wordpress.com)
20 |
21 | ## 未來讀書會(招募中)
22 |
23 | - [線上 angularjs 讀書會 預計2017年2月份開跑](https://www.facebook.com/groups/1345890212093830/)
24 | - [線上 iot 讀書會 預計2017年4月份開跑](https://www.facebook.com/groups/842415582524882/?fref=ts)
25 | - [線上 go 讀書會 預計2017年2月份開跑](https://www.facebook.com/groups/1288435607857868/)
26 | - [strongloop讀書會](https://www.facebook.com/groups/568032146690485/)
27 |
--------------------------------------------------------------------------------
/讀書會注意事項/README.md:
--------------------------------------------------------------------------------
1 | # 讀書會注意事項
2 |
3 | ## 聽眾
4 |
5 | 1. 會議加入時,記得關麥克風,避免影響到講者
6 | 2. 遇到有爭議的問題無法馬上QA,可於會後討論,以不影響講者為主
7 | 3. 會議建議可發表一篇讀書心得以加深印象
8 | 4. 請大家填寫ZoomID暱稱,方便會後討論與FB名稱對照
9 | 5. 大家專業領域不同,聞到有先後,麻煩各位先進多多指導新人
10 | 6. 準備麥克風,有時候用文字描述問題比較慢
11 | 7. 幫忙提醒講者要錄影,會後記得鼓掌感謝講者
12 | 8. 盡量互動,有不懂一定要問,一起LevelUp
13 |
14 | ## 講者
15 |
16 | 1. 記得錄影,會後上傳影片至社團
17 | 2. 可提前10分鐘測試麥克風
18 |
--------------------------------------------------------------------------------
/讀書會過往影片及討論區/README.md:
--------------------------------------------------------------------------------
1 | # 讀書會過往影片及討論
2 |
3 | ## ReactJS
4 |
5 | | 主講者 | 章節 | 連結 | 討論區 |
6 | | ------ | ------ | :------: | :------: |
7 | | Allen | 1 ~ 4 | [[影片](https://www.youtube.com/watch?v=EkjdBs1Fzeo&index=1&list=PLjCvPv97gItIvMkDEot1vYH6NmE6EwO56)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/4)] |
8 | | Allen | 5 | [[影片](https://www.youtube.com/watch?v=oJ6WZjFrUHc&index=2&list=PLjCvPv97gItIvMkDEot1vYH6NmE6EwO56)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/5)] |
9 | | 默司 | 6 ~ 7 | [[影片](https://www.facebook.com/mosluce/videos/10210633331609210/)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/6)] |
10 | | Les | 8 ~ 9 | [[影片](https://www.youtube.com/watch?v=6LbyW6xC8gM&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/7)] |
11 | | Polo | 10 ~ 11 | [[影片](https://www.youtube.com/watch?v=1z7o9mHLrK0&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/8)] |
12 |
13 | ## Flux
14 |
15 | | 主講者 | 章節 | 連結 | 討論區 |
16 | | ------ | ------ | :------: | :-----: |
17 | | Allen | 12 | [[影片](https://www.youtube.com/watch?v=2cfMA0uDOYE&index=3&list=PLjCvPv97gItIvMkDEot1vYH6NmE6EwO56)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/9)] |
18 | | James | 13 ~ 16 | [[影片](https://youtu.be/RgB_2R8j3L8)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/10)] |
19 | | Bruce | 17 | [[影片](https://youtu.be/hxtU9-3ZaSU)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/11)] |
20 | | Fergus (阿泰) | 18 | [[影片1](https://www.youtube.com/watch?v=cv57Pbry_Ec)] [[影片2](https://www.youtube.com/watch?v=qdUlfiDbCcI&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/12)] |
21 |
22 | ## Redux
23 |
24 | | 主講者 | 章節 | 連結 | 討論區 |
25 | | ------ | ------ | :------: | :-----: |
26 | | Allen | 19 | [[影片](https://youtu.be/upq6WEAAE3Y)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/13)] |
27 | | Jim | 20 ~ 21 | [[影片](https://www.facebook.com/jim20515/videos/10210631281448748/)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/14)] |
28 | | Jeff(王建傑) | 22 | 暫無 | 暫無 |
29 | | Allen | 23 | [[影片](https://www.youtube.com/watch?v=CHGis9H7SDA&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/29)] |
30 | | Max | 24 ~ 25 | 暫無 | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/27)] |
31 |
32 | ## React Native
33 |
34 | | 主講者 | 章節 | 連結 | 討論區 |
35 | | ------ | ------ | :------: | :-----: |
36 | | Larry | 1 of 30days | [[簡報](https://hackmd.io/p/ByV3Mjn2#/)] [[影片](https://www.youtube.com/watch?v=b5CmTo5JufU&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/15)] |
37 | | Larry | 2 of 30days | [[github](https://github.com/larry0220/MysteryC)] [[web demo](https://preview.c9users.io/larry0220/mystery-c/mystery-c-web/index.html)] [[影片](https://www.youtube.com/watch?v=k9d40rMdtJA&t=1878s)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/32)] |
38 |
39 | ## 番外篇
40 |
41 | ### React
42 |
43 | | 主講者 | 主題 | 連結 | 討論區 |
44 | | ------ | ------ | ------ | ----- |
45 | | Max | Meteor+React | [[影片](https://www.youtube.com/watch?v=HNEZ677A7eM)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/18)] |
46 | | 張國昭 | Redux + ReactJS | [[簡報](http://www.slideshare.net/ssusercab70d/reduxreact-js)] [[影片](https://www.youtube.com/watch?v=FAdOex9v6Yw)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/1)] |
47 | | 涼麵 | react 開發優化經驗分享 | [[影片](https://www.facebook.com/readbook999/videos/1822831534625935/)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/34)] |
48 |
49 | ### React Native
50 |
51 | | 主講者 | 主題 | 連結 | 討論區 |
52 | | ------ | ------ | ------ | ----- |
53 | | Chunghe Fang | react-native 實戰 - 鉅亨網 app | [[簡報](https://docs.google.com/presentation/d/1F27AKUZMgoaenTz0xqRCaDp2rbWgjRRzMtAU8Ubm9t8/edit#slide=id.p)] [[影片](https://youtu.be/NEmQAC9IMLk)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/3)] |
54 | | Chunghe Fang | react-native-svg/d3 分享 | [[簡報](https://github.com/chunghe/React-Native-Stock-Chart)] [[影片](https://youtu.be/qeB0pEIajbU)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/16)] |
55 | | Ch Rick | ReactNative起手式 + Redux | [[影片](https://www.youtube.com/watch?v=RLUqAgbSrPA)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/39)] |
56 |
57 | ### Middleware
58 |
59 | | 主講者 | 主題 | 連結 | 討論區 |
60 | | ------ | ------ | ------ | ----- |
61 | | Polo | graphQL | [[影片](https://www.youtube.com/watch?v=oi2hfP5WmV8&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/19)] |
62 | | Polo | graphQL 心得分享 Query Variables | [[影片](https://www.youtube.com/watch?v=Dt__SbPj5tw&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/21)] |
63 | | Polo | graphQL 心得分享 Defining Queries | [[影片](https://www.youtube.com/watch?v=PcO10aBvnA0&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/22)] |
64 | | Polo | graphQL Defining Mutations | [[影片](https://www.youtube.com/watch?v=ss1vTRAoj-g&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/23)] |
65 | | carl su | redux-saga | [[blog](https://quip.com/dKmFAdA4a2x0)] [[影片](https://www.youtube.com/watch?v=7z2_clNBUy0)] | [傳送門](https://github.com/onlinereadbook/bookreactjs/issues/31) |
66 | | 承澤 | React graphQL + Relay 入門 | [[簡報](http://www.slideshare.net/ChenTsuLin/graphgl-relay-introduction)] [[影片](https://youtu.be/K0WEazN9Nf4)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/41)] |
67 |
68 | ### Universal
69 |
70 | | 主講者 | 主題 | 連結 | 討論區 |
71 | | ------ | ------ | ------ | ----- |
72 | | 林楊興 | Universal Rendering with React/Redux | [[簡報](http://bit.ly/2bwm6Jd)] [[影片](https://youtu.be/xoMGdasN6cw)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/17)] |
73 | | Polo | react-start-kit 與 action reduce 實戰攻略 | [[影片](https://www.youtube.com/watch?v=y6hOTP9_Mog&feature=youtu.be)] | [傳送門](https://github.com/onlinereadbook/bookreactjs/issues/28) |
74 |
75 | ### Isomorphic
76 |
77 | | 主講者 | 主題 | 連結 | 討論區 |
78 | | ------ | ------ | ------ | ----- |
79 | | Tomas | server-render | [[影片](https://www.youtube.com/watch?v=BbVWl1LStIY)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/38)] |
80 |
81 |
82 | ### 開發環境
83 |
84 | | 主講者 | 主題 | 連結 | 討論區 |
85 | | ------ | ------ | ------ | ----- |
86 | | Howard Chang | Webpack簡介 | [[Blog](https://rhadow.github.io/2015/04/02/webpack-workflow/)] [[影片](https://www.youtube.com/watch?v=JRIPGi7QUmk)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/24)] |
87 | | 周昱安 | Webpack | [[影片](https://www.youtube.com/watch?v=KEtmaPM_CJI)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/25)] |
88 | | 默司 | Visual Studio Code 新手村 (1/2) | [[設定檔](https://github.com/mosluce/vscode-quick-start/tree/master/settings)] [[影片](https://www.youtube.com/watch?v=rsaqfyDLzQM)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/33)] |
89 | | 默司 | Visual Studio Code 新手村 (2/2) | [[影片](https://www.youtube.com/watch?v=zGqICko2_uo)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/33)] |
90 | | 林一村 | NextJS | [[影片](https://goo.gl/EUqvIT)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/36)] |
91 |
92 | ### 測試
93 |
94 | | 主講者 | 主題 | 連結 | 討論區 |
95 | | ------ | ------ | ------ | ----- |
96 | | Andy | NightwachJS + ReactJS todoMVC | [[簡報](https://hackmd.io/p/S1XNx8TT)] [[Github](https://github.com/bbandydd/nightwatch_example)] [[影片](https://www.youtube.com/watch?v=xZ9k_9kvI_Q)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/26)] |
97 | | Hyman | Nightwatch 進階 | [[簡報](https://hackmd.io/p/BJk6LeVQl)] [[Github](https://github.com/chnbohwr/nightwatch_example)] [[影片](https://www.youtube.com/watch?v=kuHpi_GsfDc)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/45)] |
98 |
99 | ### UI
100 |
101 | | 主講者 | 主題 | 連結 | 討論區 |
102 | | ------ | ------ | ------ | ----- |
103 | | 罡北 | Pure CSS Drawings | [[影片](https://www.youtube.com/watch?v=PlsvW-w0VaE&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/30)] |
104 | | 孟偉 | material-ui | [[影片](https://www.facebook.com/readbook999/videos/1822832427959179/?hc_ref=NEWSFEED)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/35)] |
105 |
106 | ### git
107 |
108 | | 主講者 | 主題 | 連結 | 討論區 |
109 | | ------ | ------ | ------ | ----- |
110 | | 黃彥銘 | git入門到團隊合作 | [[簡報](https://www.slideshare.net/secret/retavuvmp0Vbun)] [[影片](https://www.youtube.com/watch?v=DqYJwg6dvJo&feature=youtu.be)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/20)] |
111 |
112 |
113 | ### typescript webpack react redux
114 |
115 | | 主講者 | 主題 | 連結 | 討論區 |
116 | | ------ | ------ | ------ | ----- |
117 | | 默司 | redux with typescript |[[影片](https://www.youtube.com/watch?v=WzrLmp-1dYg)] [[GITHUB](https://github.com/mosluce/react-typescript)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/37)] |
118 |
119 |
120 | ### API Document
121 |
122 | | 主講者 | 主題 | 連結 | 討論區 |
123 | | ------ | ------ | ------ | ----- |
124 | | 默司 | RAML文件產生器 |[[影片](https://www.youtube.com/watch?v=fqoAG2GTIww)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/40)] |
125 |
126 |
127 | ### 新手場
128 |
129 | | 主講者 | 主題 | 連結 | 討論區 |
130 | | ------ | ------ | ------ | ----- |
131 | | Hyman | css3入門 | [[簡報](https://hackmd.io/p/r1hurIObg#/)] [[影片](https://youtu.be/xfbDj7Je21E)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/42)] |
132 | | Andy Tsai | javascript入門 | [[簡報](https://hackmd.io/p/r1Igzkvgl#/)] [[影片](https://www.youtube.com/watch?v=SjVbDOP4-zM)] [[土炮Template](https://github.com/bbandydd/ManualTemplate)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/43)] |
133 | | Andy Tsai | ReactJS Workshop 一日入魂 | [[簡報](https://hackmd.io/p/r1MHEMW4l)] [[影片](https://www.youtube.com/watch?v=7E370OkcBas)] | |
134 | | Andy Tsai | javascript入門 火力加強版 | [[簡報](https://hackmd.io/p/r1Igzkvgl#/)] [[影片](https://www.youtube.com/watch?v=pr7JFQaAYjg)] | |
135 |
136 | ### RxJS
137 |
138 | | 主講者 | 主題 | 連結 | 討論區 |
139 | | ------ | ------ | ------ | ----- |
140 | | 名辰 | Rx.js入門 | [[影片](https://youtu.be/dTgVYF5qHyM)] | [[傳送門](https://github.com/onlinereadbook/bookreactjs/issues/44)] |
141 |
142 |
143 | ### Meteor
144 |
145 | | 主講者 | 主題 | 連結 | 討論區 |
146 | | ------ | ------ | ------ | ----- |
147 | | Polo | 日常攻略 step by step 1~8 | [[影片](https://www.youtube.com/watch?v=P0ZbvRKa7VQ)] | |
148 | | Polo | 日常攻略 step by step 9 | [[影片](https://www.youtube.com/watch?v=x1Qj4E7LvJ0)] | |
149 | | Polo | 日常攻略 step by step 10~12 | [[影片](https://www.youtube.com/watch?v=gVkJO0ivPmA)] | |
--------------------------------------------------------------------------------