Merge pull request 'Webpack add simulator web entry' (#4) from dev-mrkbear into master
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: http://git.mrkbear.com/MrKBear/living-together/pulls/4
This commit is contained in:
commit
938d5041e4
16
.drone.yml
16
.drone.yml
@ -10,19 +10,29 @@ steps:
|
|||||||
pull: if-not-exists
|
pull: if-not-exists
|
||||||
image: node
|
image: node
|
||||||
volumes:
|
volumes:
|
||||||
- name: publish
|
- name: publish_lab
|
||||||
path: /drone/src/build
|
path: /drone/src/build_lab
|
||||||
|
- name: publish_web
|
||||||
|
path: /drone/src/build_web
|
||||||
- name: node_modules
|
- name: node_modules
|
||||||
path: /drone/src/node_modules
|
path: /drone/src/node_modules
|
||||||
commands:
|
commands:
|
||||||
- npm config set registry https://registry.npm.taobao.org
|
- npm config set registry https://registry.npm.taobao.org
|
||||||
- npm ci
|
- npm ci
|
||||||
- npm run release-lab
|
- npm run release-lab
|
||||||
|
- rm -rf ./build_lab/*
|
||||||
|
- cp ./build/* ./build_lab
|
||||||
|
- npm run release-web
|
||||||
|
- rm -rf ./build_web/*
|
||||||
|
- cp ./build/* ./build_web
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: publish
|
- name: publish_lab
|
||||||
host:
|
host:
|
||||||
path: /http/living-together-lab
|
path: /http/living-together-lab
|
||||||
|
- name: publish_web
|
||||||
|
host:
|
||||||
|
path: /http/living-together-web
|
||||||
- name: node_modules
|
- name: node_modules
|
||||||
host:
|
host:
|
||||||
path: /tmp/node_modules/living-together
|
path: /tmp/node_modules/living-together
|
||||||
|
@ -65,6 +65,11 @@ const Entry = () => ({
|
|||||||
LaboratoryPage: {
|
LaboratoryPage: {
|
||||||
import: source("./Page/Laboratory/Laboratory.tsx"),
|
import: source("./Page/Laboratory/Laboratory.tsx"),
|
||||||
dependOn: ["Model", "GLRender"]
|
dependOn: ["Model", "GLRender"]
|
||||||
|
},
|
||||||
|
|
||||||
|
SimulatorWeb: {
|
||||||
|
import: source("./Page/SimulatorWeb/SimulatorWeb.tsx"),
|
||||||
|
dependOn: ["Model", "GLRender"]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
56
config/webpack.web.js
Normal file
56
config/webpack.web.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
const {
|
||||||
|
Entry, Output, resolve, build,
|
||||||
|
TypeScriptRules, ScssRules,
|
||||||
|
HTMLPage, CssPlugin, AutoFixCssPlugin
|
||||||
|
} = require("./webpack.common");
|
||||||
|
|
||||||
|
const AllEntry = Entry();
|
||||||
|
|
||||||
|
module.exports = (env) => {
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
|
||||||
|
entry: {
|
||||||
|
GLRender: AllEntry.GLRender,
|
||||||
|
Model: AllEntry.Model,
|
||||||
|
SimulatorWeb: AllEntry.SimulatorWeb
|
||||||
|
},
|
||||||
|
|
||||||
|
output: Output("[name].[contenthash].js"),
|
||||||
|
devtool: 'source-map',
|
||||||
|
mode: "development",
|
||||||
|
resolve: resolve(),
|
||||||
|
|
||||||
|
optimization: {
|
||||||
|
runtimeChunk: 'single',
|
||||||
|
chunkIds: 'named',
|
||||||
|
moduleIds: 'named',
|
||||||
|
splitChunks: {
|
||||||
|
chunks: 'all',
|
||||||
|
minSize: 1000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
TypeScriptRules(),
|
||||||
|
ScssRules()
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
HTMLPage("index.html", "Living Together | Simulator"),
|
||||||
|
CssPlugin(),
|
||||||
|
AutoFixCssPlugin()
|
||||||
|
],
|
||||||
|
|
||||||
|
devServer: {
|
||||||
|
static: {
|
||||||
|
directory: build("./"),
|
||||||
|
},
|
||||||
|
port: 12000,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
@ -7,7 +7,10 @@
|
|||||||
"clean": "rimraf ./build/*",
|
"clean": "rimraf ./build/*",
|
||||||
"hmr-lab": "webpack serve --open --config ./config/webpack.lab.js",
|
"hmr-lab": "webpack serve --open --config ./config/webpack.lab.js",
|
||||||
"build-lab": "npm run clean & webpack --mode development --config ./config/webpack.lab.js",
|
"build-lab": "npm run clean & webpack --mode development --config ./config/webpack.lab.js",
|
||||||
"release-lab": "npm run clean & webpack --mode production --no-devtool --config ./config/webpack.lab.js"
|
"release-lab": "npm run clean & webpack --mode production --no-devtool --config ./config/webpack.lab.js",
|
||||||
|
"hmr-web": "webpack serve --open --config ./config/webpack.web.js",
|
||||||
|
"build-web": "npm run clean & webpack --mode development --config ./config/webpack.web.js",
|
||||||
|
"release-web": "npm run clean & webpack --mode production --no-devtool --config ./config/webpack.web.js"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"artwork",
|
"artwork",
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
import type { Model } from "./Model";
|
||||||
|
import { ObjectID } from "./Renderer";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据标签
|
* 数据标签
|
||||||
*/
|
*/
|
||||||
@ -6,7 +9,7 @@ class Label {
|
|||||||
/**
|
/**
|
||||||
* 唯一标识符
|
* 唯一标识符
|
||||||
*/
|
*/
|
||||||
public id: string;
|
public id: ObjectID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户定义的名称
|
* 用户定义的名称
|
||||||
@ -18,12 +21,18 @@ class Label {
|
|||||||
*/
|
*/
|
||||||
public color?: string;
|
public color?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属模型
|
||||||
|
*/
|
||||||
|
public model: Model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造器
|
* 构造器
|
||||||
* @param id 标签 ID
|
* @param id 标签 ID
|
||||||
* @param name 用户定义的名称
|
* @param name 用户定义的名称
|
||||||
*/
|
*/
|
||||||
public constructor(id: string, name?: string) {
|
public constructor(model:Model, id: ObjectID, name?: string) {
|
||||||
|
this.model = model;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
@ -34,6 +43,16 @@ class Label {
|
|||||||
public equal(label: Label): boolean {
|
public equal(label: Label): boolean {
|
||||||
return this === label || this.id === label.id;
|
return this === label || this.id === label.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否被删除
|
||||||
|
*/
|
||||||
|
public isDeleted(): boolean {
|
||||||
|
for (let i = 0; i < this.model.labelPool.length; i++) {
|
||||||
|
if (this.model.labelPool[i].equal(this)) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5,10 +5,14 @@ import { Range } from "./Range";
|
|||||||
import { Emitter, EventType, EventMixin } from "./Emitter";
|
import { Emitter, EventType, EventMixin } from "./Emitter";
|
||||||
import { CtrlObject } from "./CtrlObject";
|
import { CtrlObject } from "./CtrlObject";
|
||||||
import { ObjectID, AbstractRenderer } from "./Renderer";
|
import { ObjectID, AbstractRenderer } from "./Renderer";
|
||||||
|
import { Label } from "./Label";
|
||||||
|
|
||||||
type ModelEvent = {
|
type ModelEvent = {
|
||||||
groupAdd: Group;
|
groupAdd: Group;
|
||||||
rangeAdd: Range;
|
rangeAdd: Range;
|
||||||
|
labelAdd: Label;
|
||||||
|
labelDelete: Label;
|
||||||
|
labelChange: Label[];
|
||||||
objectAdd: CtrlObject;
|
objectAdd: CtrlObject;
|
||||||
objectDelete: CtrlObject[];
|
objectDelete: CtrlObject[];
|
||||||
objectChange: CtrlObject[];
|
objectChange: CtrlObject[];
|
||||||
@ -32,6 +36,51 @@ class Model extends Emitter<ModelEvent> {
|
|||||||
*/
|
*/
|
||||||
public objectPool: CtrlObject[] = [];
|
public objectPool: CtrlObject[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标签列表
|
||||||
|
*/
|
||||||
|
public labelPool: Label[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加标签
|
||||||
|
*/
|
||||||
|
public addLabel(name: string): Label {
|
||||||
|
console.log(`Model: Creat label with id ${this.idIndex}`);
|
||||||
|
let label = new Label(this, this.nextId, name);
|
||||||
|
this.labelPool.push(label);
|
||||||
|
this.emit("labelAdd", label);
|
||||||
|
this.emit("labelChange", this.labelPool);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索并删除一个 Label
|
||||||
|
* @param name 搜索值
|
||||||
|
*/
|
||||||
|
public deleteLabel(name: Label | ObjectID) {
|
||||||
|
let deletedLabel: Label | undefined;
|
||||||
|
let index = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < this.labelPool.length; i++) {
|
||||||
|
if (name instanceof Label) {
|
||||||
|
if (this.labelPool[i].equal(name)) {
|
||||||
|
deletedLabel = this.labelPool[i];
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
} else if (name === this.labelPool[i].id) {
|
||||||
|
deletedLabel = this.labelPool[i];
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deletedLabel) {
|
||||||
|
this.labelPool.splice(index, 1);
|
||||||
|
console.log(`Model: Delete label ${deletedLabel.name ?? deletedLabel.id}`);
|
||||||
|
this.emit("labelDelete", deletedLabel);
|
||||||
|
this.emit("labelChange", this.labelPool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加组
|
* 添加组
|
||||||
*/
|
*/
|
||||||
|
0
source/Page/SimulatorWeb/SimulatorWeb.scss
Normal file
0
source/Page/SimulatorWeb/SimulatorWeb.scss
Normal file
14
source/Page/SimulatorWeb/SimulatorWeb.tsx
Normal file
14
source/Page/SimulatorWeb/SimulatorWeb.tsx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { Component, ReactNode, createRef } from "react";
|
||||||
|
import { Entry } from "../Entry/Entry";
|
||||||
|
import "./SimulatorWeb.scss";
|
||||||
|
|
||||||
|
class SimulatorWeb extends Component {
|
||||||
|
|
||||||
|
private canvasContRef = createRef<HTMLDivElement>();
|
||||||
|
|
||||||
|
public render(): ReactNode {
|
||||||
|
return <div>Web</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry.renderComponent(SimulatorWeb);
|
Loading…
Reference in New Issue
Block a user