初始化项目
This commit is contained in:
commit
4ab6cf96c0
38 files changed
+8362
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
.DS_Store
|
||||||
|
node_modules/
|
||||||
|
src/pages/*/dist/
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
react 开发工作流
|
||||||
|
|
||||||
|
初始化
|
||||||
|
```sh
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
目录结构
|
||||||
|
```sh
|
||||||
|
>根
|
||||||
|
>>src---------开发源码
|
||||||
|
>>>lib--------库文件
|
||||||
|
>>>pages------页面源码
|
||||||
|
>>task--------构建任务
|
||||||
|
>>template----模板
|
||||||
|
>>>react------react模板
|
||||||
|
```
|
||||||
|
|
||||||
|
创建新项目
|
||||||
|
```sh
|
||||||
|
node app init --type|-t [template] --name|-n [pathName]
|
||||||
|
```
|
||||||
|
|
||||||
|
开发已有项目
|
||||||
|
```sh
|
||||||
|
npm run dev --name|-n [pathName]
|
||||||
|
```
|
||||||
|
|
||||||
|
打包已有项目
|
||||||
|
```sh
|
||||||
|
npm run pack --name|-n [pathName]
|
||||||
|
```
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
#! /usr/bin/env node
|
||||||
|
|
||||||
|
const program = require('commander');
|
||||||
|
const inquirer = require('inquirer');
|
||||||
|
const chalk = require('chalk');
|
||||||
|
const util = require('./task/util');
|
||||||
|
const task = require('./task/task');
|
||||||
|
const package = require("./package.json");
|
||||||
|
|
||||||
|
program
|
||||||
|
.version(package.version)
|
||||||
|
.command('init')
|
||||||
|
.alias('i')
|
||||||
|
.option('-t, --type [template]', '模版类型(react)')
|
||||||
|
.option('-n, --name [pathName]', '构建路径名称')
|
||||||
|
.description('初始化一个项目')
|
||||||
|
.action(option => {
|
||||||
|
let config = Object.assign({
|
||||||
|
tpl: 0,
|
||||||
|
name: null
|
||||||
|
}, option)
|
||||||
|
|
||||||
|
//console.log(config)
|
||||||
|
|
||||||
|
let promps = [];
|
||||||
|
|
||||||
|
if(!config.tpl) {
|
||||||
|
promps.push({
|
||||||
|
type: 'list',
|
||||||
|
name: 'tpl',
|
||||||
|
message: '请选择需要创建的模板:',
|
||||||
|
choices: [
|
||||||
|
{
|
||||||
|
name: 'react',
|
||||||
|
value: 'react'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'tpl',
|
||||||
|
value: 'tpl'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!config.name) {
|
||||||
|
promps.push({
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: '请输入需要创建的路径名:',
|
||||||
|
default: util.randomActName()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
inquirer.prompt(promps).then(function (answers) {
|
||||||
|
//console.log('\n',answers)
|
||||||
|
option = Object.assign(answers,option);
|
||||||
|
//console.log(option);
|
||||||
|
|
||||||
|
let paths = util.paths(option.name, __dirname);
|
||||||
|
task.init(option.tpl, paths, option._name);
|
||||||
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
program
|
||||||
|
.command('dev')
|
||||||
|
.alias('d')
|
||||||
|
.option('-n, --name [pathName]', '开发路径名称')
|
||||||
|
.description('开发一个已存在的项目')
|
||||||
|
.action(option => {
|
||||||
|
let config = Object.assign({
|
||||||
|
name: null
|
||||||
|
}, option)
|
||||||
|
|
||||||
|
//console.log(config)
|
||||||
|
|
||||||
|
let promps = [];
|
||||||
|
|
||||||
|
if(!config.name) {
|
||||||
|
promps.push({
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: '请输入需要开发的路径名:',
|
||||||
|
validate: function (input){
|
||||||
|
if(!input) {
|
||||||
|
return '不能为空'
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
inquirer.prompt(promps).then(function (answers) {
|
||||||
|
//console.log('\n',answers)
|
||||||
|
option = Object.assign(answers,option);
|
||||||
|
//console.log(option);
|
||||||
|
let paths = util.paths(option.name, __dirname);
|
||||||
|
|
||||||
|
let exi = util.pathExists(option.name, __dirname);
|
||||||
|
exi.then(result => {
|
||||||
|
//console.log(result);
|
||||||
|
if(!result) {
|
||||||
|
console.log(chalk.red('没有该目录:') + chalk.bold.red(paths.targetPath) + chalk.red(',请重新输入'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task.dev(paths, option._name);
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
program
|
||||||
|
.command('pack')
|
||||||
|
.alias('p')
|
||||||
|
.description('打包构建一个已存在的项目')
|
||||||
|
.option('-n, --name [pathName]', '打包构建路径名称')
|
||||||
|
.action(option => {
|
||||||
|
let config = Object.assign({
|
||||||
|
name: null
|
||||||
|
}, option)
|
||||||
|
|
||||||
|
//console.log(config)
|
||||||
|
|
||||||
|
let promps = [];
|
||||||
|
|
||||||
|
if(!config.name) {
|
||||||
|
promps.push({
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: '请输入需要打包构建的路径名:',
|
||||||
|
validate: function (input){
|
||||||
|
if(!input) {
|
||||||
|
return '不能为空'
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
inquirer.prompt(promps).then(function (answers) {
|
||||||
|
//console.log('\n',answers)
|
||||||
|
option = Object.assign(answers,option);
|
||||||
|
//console.log(option.name);
|
||||||
|
let paths = util.paths(option.name, __dirname);
|
||||||
|
|
||||||
|
let exi = util.pathExists(option.name, __dirname);
|
||||||
|
exi.then(result => {
|
||||||
|
//console.log(result);
|
||||||
|
if(!result) {
|
||||||
|
console.log(chalk.red('没有该目录:') + chalk.bold.red(paths.targetPath) + chalk.red(',请重新输入'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task.pack(paths, option._name);
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
program.parse(process.argv);
|
||||||
Generated
+7579
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"name": "wdp",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "web dev pack",
|
||||||
|
"main": "index.js",
|
||||||
|
"bin": {
|
||||||
|
"wdp": "app"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"new": "node app init",
|
||||||
|
"dev": "node app dev",
|
||||||
|
"pack": "node app pack"
|
||||||
|
},
|
||||||
|
"author": "dengtongyu",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.1.2",
|
||||||
|
"@babel/plugin-proposal-function-bind": "^7.0.0",
|
||||||
|
"@babel/preset-env": "^7.1.0",
|
||||||
|
"@babel/preset-react": "^7.0.0",
|
||||||
|
"babel-loader": "^8.0.4",
|
||||||
|
"chalk": "^2.4.1",
|
||||||
|
"commander": "^2.19.0",
|
||||||
|
"css-loader": "^1.0.0",
|
||||||
|
"fs-extra": "^7.0.0",
|
||||||
|
"html-webpack-plugin": "^3.2.0",
|
||||||
|
"inquirer": "^6.2.0",
|
||||||
|
"less": "^3.8.1",
|
||||||
|
"less-loader": "^4.1.0",
|
||||||
|
"react": "^16.5.2",
|
||||||
|
"react-dom": "^16.5.2",
|
||||||
|
"style-loader": "^0.23.1",
|
||||||
|
"webpack": "^4.25.1",
|
||||||
|
"webpack-dev-server": "^3.1.10"
|
||||||
|
},
|
||||||
|
"dependencies": {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"template": "react",
|
||||||
|
"style": "css",
|
||||||
|
"filename":"index.js",
|
||||||
|
"proxy": {
|
||||||
|
"/api": "http://localhost:3000"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
.app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import './app.css';
|
||||||
|
|
||||||
|
class App extends Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
你好,世界!
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<title>Examples</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
<link href="" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import App from './components/App';
|
||||||
|
import './index.css';
|
||||||
|
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'));
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"template": "react",
|
||||||
|
"style": "css",
|
||||||
|
"filename":"index.js",
|
||||||
|
"proxy": {
|
||||||
|
"/api": "http://localhost:3000"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import './app.css';
|
||||||
|
|
||||||
|
class App extends Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
Hello World!
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<title>Examples</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
<link href="" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import App from './components/App';
|
||||||
|
import './index.css';
|
||||||
|
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'));
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"template": "react",
|
||||||
|
"style": "css",
|
||||||
|
"proxy": {
|
||||||
|
"/api": "http://localhost:3000"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import './app.css';
|
||||||
|
|
||||||
|
class App extends Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
Hello World!
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<title>Examples</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
<link href="" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import App from './components/App';
|
||||||
|
import './index.css';
|
||||||
|
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'));
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"template": "react",
|
||||||
|
"style": "css",
|
||||||
|
"proxy": {
|
||||||
|
"/api": "http://localhost:3000"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import './app.css';
|
||||||
|
|
||||||
|
class App extends Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
Hello World!
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<title>Examples</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
<link href="" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import App from './components/App';
|
||||||
|
import './index.css';
|
||||||
|
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'));
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const chalk = require('chalk');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const webpackDevServer = require('webpack-dev-server');
|
||||||
|
const util = require('./util');
|
||||||
|
const webpackConfig = require('./webpack.react');
|
||||||
|
|
||||||
|
let _paths = {};
|
||||||
|
|
||||||
|
let _configJson = {};
|
||||||
|
|
||||||
|
exports.init = (type, paths, command) => {
|
||||||
|
_paths = paths;
|
||||||
|
|
||||||
|
let tplPath = path.join(_paths.rootPath, util.tplTypePath(type));
|
||||||
|
fs.copy(tplPath, _paths.targetPath)
|
||||||
|
.then(() => {
|
||||||
|
console.log(chalk.bold.green('生成模板成功!'));
|
||||||
|
|
||||||
|
_configJson = util.configJson(_paths.targetPath);
|
||||||
|
|
||||||
|
if(_configJson.template == 'react') {
|
||||||
|
webpackConfig.run(command);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
console.error(chalk.bold.red('生成模板失败!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.dev = (paths, command) => {
|
||||||
|
_paths = paths;
|
||||||
|
|
||||||
|
if(_configJson.template == 'react') {
|
||||||
|
webpackConfig.run(paths, command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.pack = (paths, command) => {
|
||||||
|
_paths = paths;
|
||||||
|
|
||||||
|
_configJson = util.configJson(_paths.targetPath);
|
||||||
|
|
||||||
|
if(_configJson.template == 'react') {
|
||||||
|
webpackConfig.run(paths, command);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
//const inquirer = require('inquirer');
|
||||||
|
|
||||||
|
//随机路径名
|
||||||
|
exports.randomActName = () => {
|
||||||
|
let d = new Date();
|
||||||
|
let m = (d.getMonth() + 1) < 10 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1).toString();
|
||||||
|
let dd = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
|
||||||
|
let str = d.getFullYear() + m + dd + String.fromCharCode(Math.floor(Math.random() * 26) + "a".charCodeAt(0)) + Math.floor(Math.random() * 10);
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
//模板路径名
|
||||||
|
exports.tplTypePath = (type) => {
|
||||||
|
let _path = '';
|
||||||
|
if(type) {
|
||||||
|
_path = path.join('template', type);
|
||||||
|
}else{
|
||||||
|
_path = path.join('template', 'react');
|
||||||
|
}
|
||||||
|
return _path;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//初始化后的路径信息
|
||||||
|
exports.paths = (pathName, rootPath) => {
|
||||||
|
return {
|
||||||
|
pathName:pathName,
|
||||||
|
rootPath:rootPath,
|
||||||
|
targetPath:path.join(rootPath, 'src', 'pages' , pathName)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//获取项目config
|
||||||
|
exports.configJson = (targetPath) => {
|
||||||
|
let jsonPath = path.join(targetPath, 'config.json');
|
||||||
|
|
||||||
|
return require(jsonPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
//是否存在该目录
|
||||||
|
exports.pathExists = async (pathName, rootPath) => {
|
||||||
|
let targetPath = path.join(rootPath, 'src', 'pages' , pathName);
|
||||||
|
let exists = await fs.pathExists(targetPath);
|
||||||
|
return exists;
|
||||||
|
// if(exists) {
|
||||||
|
// return true;
|
||||||
|
// }else{
|
||||||
|
// return '没有该目录,请重新输入'
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
//会话流
|
||||||
|
// exports.inquirer = (option, promps, cb) => {
|
||||||
|
// inquirer.prompt(promps).then(function (answers) {
|
||||||
|
// //console.log('\n',answers)
|
||||||
|
// option = Object.assign(answers,option);
|
||||||
|
|
||||||
|
// if(cb) cb(option);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const chalk = require('chalk');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const webpackDevServer = require('webpack-dev-server');
|
||||||
|
const HtmlWebPackPlugin = require('html-webpack-plugin');
|
||||||
|
const util = require('./util');
|
||||||
|
|
||||||
|
let _webpackConfig = {
|
||||||
|
module:{
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
use: {
|
||||||
|
loader: 'babel-loader',
|
||||||
|
options: {
|
||||||
|
presets: [
|
||||||
|
'@babel/preset-react',
|
||||||
|
'@babel/preset-env'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
["@babel/plugin-proposal-function-bind"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
use: ['style-loader', 'css-loader']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins:[]
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.run = (paths, command) => {
|
||||||
|
|
||||||
|
//入口文件
|
||||||
|
_webpackConfig.entry = path.join(paths.targetPath, 'src', 'index.js');
|
||||||
|
|
||||||
|
//输出路径
|
||||||
|
_webpackConfig.output = {
|
||||||
|
path: path.join(paths.targetPath, 'dist'),
|
||||||
|
filename: 'index.js'
|
||||||
|
}
|
||||||
|
|
||||||
|
_webpackConfig.plugins.push(
|
||||||
|
new HtmlWebPackPlugin({
|
||||||
|
template: path.join(paths.targetPath, 'src', 'index.html'),
|
||||||
|
filename: path.join(paths.targetPath, 'dist', 'index.html')
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
//console.log(_webpackConfig,paths);
|
||||||
|
|
||||||
|
let _configJson = util.configJson(paths.targetPath);
|
||||||
|
|
||||||
|
let compiler = null;
|
||||||
|
|
||||||
|
if(command == 'init' || command == 'dev') {
|
||||||
|
_webpackConfig.mode = 'development';
|
||||||
|
|
||||||
|
let devServer = {
|
||||||
|
contentBase: path.join(paths.targetPath, "dist"),
|
||||||
|
compress: true,
|
||||||
|
host: 'localhost',
|
||||||
|
port: 8088,
|
||||||
|
hot: true,
|
||||||
|
//open: true,
|
||||||
|
stats: {colors: true}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_configJson.proxy) {
|
||||||
|
devServer.proxy = _configJson.proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
//node api 启动热更新
|
||||||
|
_webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin());
|
||||||
|
webpackDevServer.addDevServerEntrypoints(_webpackConfig, devServer);
|
||||||
|
|
||||||
|
compiler = webpack(_webpackConfig);
|
||||||
|
|
||||||
|
//node api 启动本地服务
|
||||||
|
let server = new webpackDevServer(compiler, devServer);
|
||||||
|
|
||||||
|
console.log(_webpackConfig);
|
||||||
|
|
||||||
|
server.listen(devServer.port, 'localhost', (err) => {
|
||||||
|
if(err) {
|
||||||
|
console.log(err);
|
||||||
|
}else{
|
||||||
|
console.log(chalk.bold.green('服务启动: '+ devServer.contentBase +' : http://localhost:' + devServer.port));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if(command == 'pack') {
|
||||||
|
_webpackConfig.mode = 'production';
|
||||||
|
|
||||||
|
compiler = webpack(_webpackConfig, (err, stats) => {
|
||||||
|
if (err || stats.hasErrors()) {
|
||||||
|
//处理错误
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
//处理完成
|
||||||
|
console.log(chalk.bold.green('打包编译完成!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"template": "react",
|
||||||
|
"style": "css",
|
||||||
|
"proxy": {
|
||||||
|
"/api": "http://localhost:3000"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.app {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import './app.css';
|
||||||
|
|
||||||
|
class App extends Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
Hello World!
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default App;
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<title>Examples</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
<link href="" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import App from './components/App';
|
||||||
|
import './index.css';
|
||||||
|
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'));
|
||||||
Reference in new issue
Block a user