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

Reviewed-on: http://git.mrkbear.com/MrKBear/living-together/pulls/4
This commit is contained in:
MrKBear 2022-02-22 23:13:10 +08:00
commit 938d5041e4
8 changed files with 162 additions and 6 deletions

View File

@ -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

View File

@ -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
View 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;
};

View File

@ -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",

View File

@ -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;
}
} }
/** /**

View File

@ -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);
}
}
/** /**
* *
*/ */

View 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);