Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: render every page with a real html #229

Merged
merged 5 commits into from
Sep 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
128 changes: 106 additions & 22 deletions nino.koei.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,109 @@
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
const PostCompile = require('post-compile-webpack-plugin');
const IO = require('socket.io-client');
const fs = require('fs-extra');

const assetsFiles = fs.readdirSync(path.join(__dirname, 'src/assets'));
const mappingFile = path.join(__dirname, 'src/assets/mapping.json');
const targetFiles = fs
.readJsonSync(mappingFile)
.filter(item => item.visible !== false && !assetsFiles.includes(item.id))
.map(({ id, category }) => {
const initMappingFiles = () => {
const assetsFiles = fs.readdirSync(path.join(__dirname, 'src/assets'));
const mappingFile = path.join(__dirname, 'src/assets/mapping.json');
const targetFiles = fs
.readJsonSync(mappingFile)
.filter(item => item.visible !== false && !assetsFiles.includes(item.id));
return targetFiles;
};

const getCopyPluginProps = mappings =>
mappings.map(({ id, category }) => {
const src = `src/assets/${category}/${id}.${
category === 'mapping' ? 'json' : 'md'
}`;
const dist = `dist/assets/${category}/${id}.${
category === 'mapping' ? 'json' : 'md'
}`;

return {
from: path.join(__dirname, src),
to: path.join(__dirname, dist),
};
});

const commonHtmlWebpackProps = {
template: './src/index.html',
environment: process.env.BUILD_ENV !== 'prod',
socket:
process.env.BUILD_ENV !== 'prod'
? `
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
io('http://localhost:9099').on('refresh', function() {
location.reload();
});
</script>`
: '',
inject: 'body',
minify: {
minifyJS: true,
minifyCSS: true,
removeComments: true,
collapseWhitespace: true,
},
};

const getHtmlPluginProps = mappings => {
const mainPageProps = [
new HtmlWebpackPlugin({
...commonHtmlWebpackProps,
filename: 'index.html',
chunks: ['main-page'],
}),
];
const detailPageProps = [];
const editorPageProps = [];

mappings.map(({ id, category }) => {
switch (category) {
case 'mapping':
detailPageProps.push(
new HtmlWebpackPlugin({
...commonHtmlWebpackProps,
filename: `${category}/${id}/index.html`,
chunks: ['mapping-detail'],
}),
);
break;

case 'markdown':
detailPageProps.push(
new HtmlWebpackPlugin({
...commonHtmlWebpackProps,
filename: `${category}/${id}/index.html`,
chunks: ['markdown-detail'],
}),
);
editorPageProps.push(
new HtmlWebpackPlugin({
...commonHtmlWebpackProps,
filename: `markdown-editor/${id}/index.html`,
chunks: ['markdown-editor'],
}),
);
break;

default:
break;
}
});

return [...mainPageProps, ...detailPageProps, ...editorPageProps];
};

const readableMappingFiles = initMappingFiles();
const copyPluginProps = getCopyPluginProps(readableMappingFiles);
const htmlPluginProps = getHtmlPluginProps(readableMappingFiles);

const exhentaiFiles = [];
if (process.env.BUILD_ENV !== 'prod') {
exhentaiFiles.push({
Expand All @@ -34,17 +113,18 @@ if (process.env.BUILD_ENV !== 'prod') {
}

const plugins = [
...htmlPluginProps,
new CopyWebpackPlugin([
{
from: path.join(__dirname, 'src/assets'),
to: path.join(__dirname, 'dist/assets'),
ignore: ['mapping/*', 'markdown/*', 'exhentai/*'],
},
...targetFiles,
...copyPluginProps,
...exhentaiFiles,
]),
new MomentLocalesPlugin({
localesToKeep: ['es-us', 'zh-cn'],
localesToKeep: ['zh-cn'],
}),
];

Expand All @@ -63,19 +143,23 @@ if (process.env.BUILD_ENV !== 'prod') {

module.exports = {
entry: {
ninoninoni: path.join(__dirname, 'src'),
'main-page': path.join(
__dirname,
'src/controller/MainPageDataController.tsx',
),
'markdown-detail': path.join(
__dirname,
'src/controller/MarkdownDetailDataController.tsx',
),
'markdown-editor': path.join(
__dirname,
'src/controller/MarkdownEditorDataController.tsx',
),
'mapping-detail': path.join(
__dirname,
'src/controller/MappingDetailDataController.tsx',
),
},
externals: { 'socket.io-client': 'socket.io-client' },
plugins,
optimization: {
splitChunks: {
cacheGroups: {
common: {
name: 'common',
chunks: 'initial',
priority: 2,
minChunks: 2,
},
},
},
},
};
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
"compile:server": "tsc -p server",
"d": "npm run compile:server -- --watch",
"dev": "rimraf dist && nino koei -w -d --not-copy-assets",
"go": "nino go",
"lint": "nino eslint",
"lint-staged": "lint-staged",
"prettier": "nino prettier",
Expand All @@ -49,7 +48,10 @@
"koa": "^2.8.1",
"mini-xmind": "^1.3.2",
"mysql": "^2.17.1",
"nino-cli": "^1.2.4",
"puppeteer-core": "^1.20.0",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"typescript": "^3.6.3"
},
"devDependencies": {
Expand All @@ -65,7 +67,6 @@
"@types/react": "^16.9.2",
"@types/react-dom": "^16.9.0",
"@types/react-lazyload": "^2.5.0",
"@types/react-router-dom": "^4.3.5",
"@types/request": "^2.48.3",
"@types/socket.io": "^2.1.2",
"@types/socket.io-client": "^1.4.32",
Expand All @@ -87,7 +88,6 @@
"npm-run-all": "^4.1.5",
"post-compile-webpack-plugin": "^0.1.2",
"react-lazyload": "^2.6.2",
"react-router-dom": "^5.0.1",
"rimraf": "^3.0.0",
"socket.io": "^2.3.0",
"socket.io-client": "^2.3.0",
Expand Down
17 changes: 11 additions & 6 deletions src/controller/MainPageDataController.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { useEffect, useState } from 'react';
import ReactDOM from 'react-dom';
import MainPage from '../pages/MainPage';
import { MappingProps } from '../../server/controller/DocumentController';
import MainPageList from '../pages/MainPageList';
Expand Down Expand Up @@ -50,7 +51,7 @@ const handleListItemClick = ({
category: 'mapping' | 'markdown';
id: string;
}) => {
location.hash = `/${category}/${id}`;
location.href = `/${category}/${id}`;
};

const getExhentaiTargetDataSource = async (url: string) => {
Expand Down Expand Up @@ -79,7 +80,9 @@ const MainPageDataController = () => {
useResize();

useEffect(() => {
isLocal && getExhentaiDateSet();
if (isLocal) {
getExhentaiDateSet();
}
getSider();
getMapping();
}, []);
Expand Down Expand Up @@ -155,9 +158,11 @@ const MainPageDataController = () => {
message.success(`${item.category} 初始化完成`);
}
handleModalCancel();
location.hash = `/${item.category}${
item.category === 'markdown' ? '/edit' : ''
}/${id}`;
if (item.category === 'mapping') {
location.href = `/mapping/${id}`;
return;
}
location.href = `/markdown-editor/${id}`;
};

const handleHide = async ({ id }: MappingProps) => {
Expand Down Expand Up @@ -230,4 +235,4 @@ const MainPageDataController = () => {
);
};

export default MainPageDataController;
ReactDOM.render(<MainPageDataController />, document.getElementById('root'));
13 changes: 8 additions & 5 deletions src/controller/MappingDetailDataController.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import React from 'react';
import ReactDOM from 'react-dom';
import MappingDetail from '../pages/MappingDetail';
import { DataSource } from 'mini-xmind/lib/canvas/core';
import { useFetchDocumentData } from '../hooks/useFetchDocumentData';
import {
MarkdownEditorSaveProps,
showMessageAfterFetching,
} from './MarkdownEditorDataController';
import { getPathNameFromUrl } from '../utils';

const MappingDetailDataController = (props: {
match: { params: { id: string } };
}) => {
const id: string = props.match.params.id;
const MappingDetailDataController = () => {
const id: string = getPathNameFromUrl();

const handleOnSave = async (newData: DataSource) => {
const params: MarkdownEditorSaveProps = {
Expand All @@ -37,4 +37,7 @@ const MappingDetailDataController = (props: {
return <MappingDetail dataSource={data} onChange={handleOnChange} />;
};

export default MappingDetailDataController;
ReactDOM.render(
<MappingDetailDataController />,
document.getElementById('root'),
);
13 changes: 8 additions & 5 deletions src/controller/MarkdownDetailDataController.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import React from 'react';
import ReactDOM from 'react-dom';
import { useFetchDocumentData } from '../hooks/useFetchDocumentData';
import MarkdownDetail from '../pages/MarkdownDetail';
import { getPathNameFromUrl } from '../utils';

const MarkdownDetailDataController = (props: {
match: { params: { id: string } };
}) => {
const id: string = props.match.params.id;
const MarkdownDetailDataController = () => {
const id: string = getPathNameFromUrl();
const [data] = useFetchDocumentData(id, 'markdown');

return <MarkdownDetail dataSource={data} />;
};

export default MarkdownDetailDataController;
ReactDOM.render(
<MarkdownDetailDataController />,
document.getElementById('root'),
);
15 changes: 9 additions & 6 deletions src/controller/MarkdownEditorDataController.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import React from 'react';
import ReactDOM from 'react-dom';
import { message } from 'antd';
import { useFetchDocumentData } from '../hooks/useFetchDocumentData';
import MarkdownEditor from '../pages/MarkdownEditor';
import { DataSource } from 'mini-xmind/lib/canvas/core';
import { getPathNameFromUrl } from '../utils';

export interface MarkdownEditorDataControllerProps {
match: any;
Expand All @@ -21,10 +23,8 @@ export function showMessageAfterFetching(result: any) {
result ? message.success('保存成功') : message.error('保存失败');
}

const MarkdownEditorDataController = (props: {
match: { params: { id: string } };
}) => {
const id: string = props.match.params.id;
const MarkdownEditorDataController = () => {
const id: string = getPathNameFromUrl();

const handleOnSave = async () => {
const params: MarkdownEditorSaveProps = {
Expand All @@ -33,7 +33,7 @@ const MarkdownEditorDataController = (props: {
category: 'markdown',
format: true,
};
const response = await fetch('document/update', {
const response = await fetch('../document/update', {
body: JSON.stringify(params),
method: 'POST',
headers: { 'Content-Type': 'application/json' },
Expand All @@ -57,4 +57,7 @@ const MarkdownEditorDataController = (props: {
);
};

export default MarkdownEditorDataController;
ReactDOM.render(
<MarkdownEditorDataController />,
document.getElementById('root'),
);
2 changes: 1 addition & 1 deletion src/hooks/useFetchDocumentData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export function useFetchDocumentData(
onSaveCallback?: (data: DataSource) => void,
) {
const ext = type === 'mapping' ? 'json' : 'md';
const url = `./assets/${type}/${id}.${ext}`;
const url = `../../assets/${type}/${id}.${ext}`;
const [data, setData] = useState();
useBindKeyDown(data, onSaveCallback);

Expand Down
4 changes: 4 additions & 0 deletions src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
</head>

<body>
<%= htmlWebpackPlugin.options.socket %>
<script>
window.__isLocal = <%= htmlWebpackPlugin.options.environment %>;
</script>
<div id="root"></div>
</body>
</html>
7 changes: 0 additions & 7 deletions src/index.tsx

This file was deleted.