167 lines
3.8 KiB
JavaScript
167 lines
3.8 KiB
JavaScript
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
|
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
|
const AutoPrefixer = require('autoprefixer');
|
|
|
|
const Path = require("path");
|
|
const ProjectPath = Path.resolve(__dirname, "../");
|
|
const SourcePath = Path.resolve(ProjectPath, "./source");
|
|
const BuildPath = Path.resolve(ProjectPath, "./build");
|
|
const AssetsPath = Path.resolve(ProjectPath, "./assets");
|
|
|
|
/**
|
|
* 解析项目路径
|
|
* @param {string} path 相对项目根目录的路径
|
|
* @return {string} 解析路径
|
|
*/
|
|
function project(path) {
|
|
return Path.resolve(ProjectPath, path);
|
|
}
|
|
|
|
/**
|
|
* 解析源文件路径
|
|
* @param {string} path 相对源文件的路径
|
|
* @return {string} 解析路径
|
|
*/
|
|
function source(path) {
|
|
return Path.resolve(SourcePath, path);
|
|
}
|
|
|
|
/**
|
|
* 解析编译文件路径
|
|
* @param {string} path 相对编译文件的路径
|
|
* @return {string} 解析路径
|
|
*/
|
|
function build(path) {
|
|
return Path.resolve(BuildPath, path);
|
|
}
|
|
|
|
/**
|
|
* 解析资源文件路径
|
|
* @param {string} path 相对资源文件的路径
|
|
* @return {string} 解析路径
|
|
*/
|
|
function assets(path) {
|
|
return Path.resolve(AssetsPath, path);
|
|
}
|
|
|
|
/**
|
|
* 项目入口
|
|
*/
|
|
const Entry = () => ({
|
|
|
|
Model: {
|
|
import: source("./Model/Model.ts")
|
|
},
|
|
|
|
GLRender: {
|
|
import: source("./GLRender/ClassicRenderer.ts")
|
|
},
|
|
|
|
LaboratoryPage: {
|
|
import: source("./Page/Laboratory/Laboratory.tsx"),
|
|
dependOn: ["Model", "GLRender"]
|
|
},
|
|
|
|
SimulatorWeb: {
|
|
import: source("./Page/SimulatorWeb/SimulatorWeb.tsx"),
|
|
dependOn: ["Model", "GLRender"]
|
|
},
|
|
|
|
SimulatorDesktop: {
|
|
import: source("./Page/SimulatorDesktop/SimulatorDesktop.tsx"),
|
|
dependOn: ["Model", "GLRender"]
|
|
},
|
|
|
|
Service: {
|
|
import: source("./Service/Service.ts")
|
|
},
|
|
|
|
ServiceRunner: {
|
|
import: source("./Service/Runner.ts"),
|
|
dependOn: ["Service"]
|
|
},
|
|
|
|
Electron: {
|
|
import: source("./Electron/Electron.ts"),
|
|
dependOn: ["Service"]
|
|
},
|
|
|
|
SimulatorWindow: {
|
|
import: source("./Electron/SimulatorWindow.ts"),
|
|
}
|
|
});
|
|
|
|
/**
|
|
* 项目输出
|
|
* @param {string} name 输出名字
|
|
* @returns 输出配置
|
|
*/
|
|
const Output = (name = "[name].js") => ({
|
|
filename: name,
|
|
path: BuildPath
|
|
});
|
|
|
|
const TypeScriptRules = () => ({
|
|
test: /\.tsx?$/,
|
|
use: [
|
|
{
|
|
loader: "ts-loader",
|
|
options: {
|
|
configFile: project("./tsconfig.json")
|
|
}
|
|
},
|
|
]
|
|
});
|
|
|
|
const ScssRules = () => ({
|
|
test:/\.(sass|scss)$/,
|
|
use:[MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader']
|
|
});
|
|
|
|
const resolve = (plugins = []) => {
|
|
|
|
let res = {
|
|
extensions: [ ".tsx", '.ts', '.js' ],
|
|
fallback: {
|
|
'react/jsx-runtime': 'react/jsx-runtime.js',
|
|
'react/jsx-dev-runtime': 'react/jsx-dev-runtime.js',
|
|
},
|
|
plugins: plugins
|
|
};
|
|
|
|
res.plugins.push(
|
|
new TsconfigPathsPlugin({
|
|
baseUrl: ProjectPath,
|
|
configFile: project("./tsconfig.json")
|
|
})
|
|
)
|
|
|
|
return res;
|
|
};
|
|
|
|
/**
|
|
* 使用模板
|
|
* @param {string} url 使用的模板路径
|
|
* @returns HTML插件
|
|
*/
|
|
const HTMLPage = (name, title) => {
|
|
return new HtmlWebpackPlugin({
|
|
xhtml: true,
|
|
title: title ?? "Living Together",
|
|
favicon: assets("./favicon.ico"),
|
|
filename: build(name ?? "index.html"),
|
|
template: assets("index.html")
|
|
});
|
|
}
|
|
|
|
const CssPlugin = () => new MiniCssExtractPlugin();
|
|
|
|
const AutoFixCssPlugin = () => AutoPrefixer;
|
|
|
|
module.exports = {
|
|
project, source, assets, build,
|
|
Entry, Output, resolve,
|
|
TypeScriptRules, ScssRules,
|
|
HTMLPage, CssPlugin, AutoFixCssPlugin
|
|
} |