每次寫重複的代碼是否是很浪費時間呢?接下來介紹一款用命令行就能夠自動生成代碼的工具。css
plop的介紹 https://www.npmjs.com/package...html
npm install --save-dev plop
2 . 全局安裝,這樣就能夠用plop命令了;react
npm install -g plop
mac 使用 es6
sudo npm install -g plop
3.在項目的根目錄建立plop.js文件,寫入一下代碼;web
module.exports = function (plop) { plop.setGenerator('component', { description: '視圖組件', prompts: [{ type: 'input', name: 'name', message: '組件的名字, 如MyApp', validate: function (value) { if ((/([A-Z][a-z]+)+/).test(value)) { return true; } return '組件名稱必須爲駝峯形式'; } }], actions: [ /** * TemplateComponent.js */ { type: 'add', path: 'src/component/{{name}}/{{name}}.js', templateFile: 'templates/components/TemplateComponent.js' }, { type: 'modify', path: 'src/component/{{name}}/{{name}}.js', pattern: /TemplateComponent/g, template: '{{name}}' }, { type: 'modify', path: 'src/component/{{name}}/{{name}}.js', pattern: /template-component/g, template: '{{dashCase name}}' }, /** * template-component.scss and css */ { type: 'add', path: 'src/component/{{name}}/{{dashCase name}}.css', templateFile: 'templates/components/template-component.css' },{ type: 'modify', path: 'src/component/{{name}}/{{dashCase name}}.css', pattern: /TemplateComponent/g, template: '{{dashCase name}}' }, { type: 'modify', path: 'src/component/{{name}}/{{dashCase name}}.css', pattern: /template-component/g, template: '{{dashCase name}}' }, ] }); plop.setGenerator('router', { description: '路由生成器', prompts: [{ type: 'list', name: 'rootPath', message: '生成路由的目錄', choices: [ 'Routes' ] }, { type: 'input', name: 'routerPath', message: '路由的名字, 所有小寫,用下劃線分詞 如:orders' }], actions: function(data){ console.log(data); return [{ // 配置路由文件 type: 'modify', path: 'src/{{rootPath}}/index.js', pattern: /\/\/ generator import/, template: "import {{pascalCase routerPath }} from './{{ routerPath }}';\n// generator import" }, { type: 'modify', path: 'src/{{rootPath}}/index.js', pattern: /{ \/\* generator router \*\/ }/, template: '<Route path="/{{ routerPath }}" component={ {{pascalCase routerPath}} } desc="TODO: 該路由描述" />\n { /* generator router */ }' }, { // 配置路由內容 type: 'add', path: 'src/{{rootPath}}/{{routerPath}}/index.js', templateFile: 'templates/router/index.js' }, { type: 'add', path: 'src/{{rootPath}}/{{routerPath}}/{{pascalCase routerPath}}List.js', templateFile: 'templates/router/list.js' }, { type: 'add', path: 'src/{{rootPath}}/{{routerPath}}/{{pascalCase routerPath}}Detail.js', templateFile: 'templates/router/detail.js' }]; } }); };
4.在根目錄新建templates文件,在templates文件下新建components和router文件npm
5.在components下新建template-component.css和Templatecomponent.js文件dom
template-component.css @keyframes fadeInUp { from { opacity: 0; transform: translate3d(0, 10px, 0); } to { opacity: 1; transform: none; } } .TemplateComponent { animation-name: fadeInUp; animation-duration: 1s; animation-fill-mode: both; display: flex; flex: 1; } .TemplateComponent *, .TemplateComponent :after, .TemplateComponent :before { box-sizing: border-box; } .TemplateComponent .fl { float: left; } .TemplateComponent .fr { float: right; } .TemplateComponent .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .TemplateComponent .clearfix { display: inline-block; } .TemplateComponent * html .clearfix { height: 1%; } .TemplateComponent .clearfix { display: block; } .TemplateComponent ul li:hover { background: #f63; cursor: pointer; } Templatecomponent.js /** * Created by ${USER} on ${DATE}. * https://www.jetbrains.com/help/webstorm/file-template-variables.html 動畫callback只支持1.x版本的TransitionGroup */ import React,{Component} from 'react'; import './template-component.css'; const styles = { container: {} }; //import ReactDOM from 'react-dom'; //import {TweenMax} from "gsap"; //import PropTypes from 'prop-types'; class TemplateComponent extends React.Component { static defaultProps = { ...Component.defaultProps } static propTypes = {} constructor(props){ super(props) this.state = {} this.dom=React.createRef() //React.createRef();current //事件綁定在es6中用於自定義事件props事件不適用 //this.handleClick = this.handleClick.bind(this); } //組件將要裝載 //componentWillMount(){} //組件加載完畢 componentDidMount(){ //this.dom.root=ReactDOM.findDOMNode(this); } //組件將接收道具 //componentWillReceiveProps(nextProps){} //shouldComponentUpdate(nextProps, nextState) {} //組件將更新 //componentWillUpdate(nextProps, nextState){} //組件更新完畢 //componentDidUpdate(nextProps, nextState){} //組件將要卸載 //componentWillUnmount(){} /*動畫*/ //componentWillAppear(callback){} //componentDidAppear(){} //componentWillEnter(callback){} //componentDidEnter(){} //componentWillLeave(callback){} //componentDidLeave(){} render() { return ( <div ref={this.dom}></div> ); } } export default TemplateComponent;
組件的模板就是以上,還能夠根據自身須要定製路由。webstorm
6.在terminal中輸入plop,就會讓你選擇是要生成組件仍是路由,可根據須要選擇,鍵入enter,再輸入組件名稱,就能夠在模板中設置好的路徑中找到文件,是否是很方便呢?工具