webpack打包集成
- 抽取公共基础配置[webpack.base.js]
const path = require("path");
const buildModules = function (externalModule) {
let rules = [
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
},
},
{
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
use: [
{
loader: require.resolve("babel-loader"),
},
],
},
],
},
];
if (externalModule && externalModule.rules) {
rules = rules.concat(externalModule.rules);
}
return {
rules,
};
};
const buildPlugins = function (externalPlugins) {
const plugins = [];
return plugins.concat(externalPlugins);
};
module.exports = (options) => ({
mode: options.mode || "production",
entry: options.entry,
output: Object.assign(
{
path: "/",
globalObject: "this",
},
options.output
),
module: buildModules(options.module),
plugins: buildPlugins(options.plugins || []),
externals: options.externals || {},
devtool: options.devtool,
target: options.target,
node: options.node || {},
resolve: options.resolve,
});
const getEntry = require("../scripts/getEntry");
const path = require("path");
const { AssetOutputPlugin } = require("../plugins");
module.exports = require("./webpack.base")({
devtool: "inline-source-map",
mode: "development",
target: "electron-renderer",
entry: getEntry(),
output: {
path: path.join(process.cwd(), "app/build/statics"),
filename: "[name].js",
publicPath: "/statics",
},
node: {
__dirname: false,
__filename: false,
},
plugins: [new AssetOutputPlugin()],
resolve: {
modules: ["client", "node_modules"],
extensions: [".js", ".jsx", ".ts", ".tsx", ".react.js"],
mainFields: ["browser", "jsnext:main", "main"],
alias: {
"@common": path.join(process.cwd(), "client/common"),
"@login": path.join(process.cwd(), "client/modules/login"),
},
},
});
const path = require("path");
const webpack = require("webpack");
const CopyWebpackPlugin = require("copy-webpack-plugin");
module.exports = require("./webpack.base")({
mode: "production",
devtool: "eval-source-map",
entry: {
main: path.join(process.cwd(), "app/src/index.ts"),
preloadMain: path.join(process.cwd(), "app/src/preloadScript/main.ts"),
preloadRender: path.join(process.cwd(), "app/src/preloadScript/render.ts"),
},
output: {
path: path.join(process.cwd(), "app/build"),
globalObject: "this",
libraryTarget: "commonjs2",
},
target: "electron-main",
node: {
__dirname: false,
__filename: false,
},
plugins: [
new webpack.EnvironmentPlugin({
NODE_ENV: "production",
DEBUG_PROD: false,
START_MINIMIZED: false,
}),
new CopyWebpackPlugin({
patterns: [
{
from: path.join(process.cwd(), "app/src/server/views"),
to: path.join(process.cwd(), "app/build/views"),
},
],
}),
],
resolve: {
modules: ["app", "node_modules"],
extensions: [".js", ".jsx", ".ts", ".tsx"],
mainFields: ["browser", "jsnext:main", "main"],
},
});
- electron-builder集成打包
- internals
- package
- config // 打包配置
- base.js
- mac.js
- windows.js
- linux.js
- ci // 真正的打包build
- base.js
- mac.js
- windows.js
- linux.js
- build.js
module.exports = (options) => ({
productName: options?.productName || "demonbe-electron",
appId: options?.appId || "com.demonbe.app",
copyright: options?.copyright || "Copyright © year Jake",
directories: {
output: "packages",
},
files: ["!src/", "!tsconfig.json"],
});
const electronBuilder = require("electron-builder");
class Base {
config = {};
beforBuild() {}
build() {
this.beforBuild();
this.electronBuild();
this.beforBuild();
}
electronBuild() {
electronBuilder.build(this.config);
}
afterBuild() {}
}
module.exports = Base;