This commit is contained in:
黄心宇 2023-12-26 17:27:28 +08:00
parent 2ab3da1e09
commit ad20dcf8ea
6 changed files with 322 additions and 47 deletions

View File

@ -2,9 +2,20 @@
"presets": [
"env",
"react",
"stage-2"
"stage-2",
"es2015"
],
"plugins": [[
"plugins": [["antd", {
"libraryDirectory": "lib",
"libraryName": "antd"
}],[
"transform-imports",
{
"libraryName": "antd",
"libraryDirectory": "lib",
"camel2KebabCase": false
}
],[
"transform-runtime",
{
"helpers": false,
@ -12,5 +23,5 @@
"regenerator": true,
"moduleName": "babel-runtime"
}
],["transform-decorators-legacy"]]
],["transform-decorators-legacy"], ["syntax-dynamic-import"], ["transform-class-properties"]]
}

View File

@ -47,6 +47,7 @@ module.exports = {
appIndexJs: resolveApp('src/index.js'),
appPackageJson: resolveApp('package.json'),
appSrc: resolveApp('src'),
serverSrc: resolveApp('server'),
yarnLockFile: resolveApp('yarn.lock'),
testsSetup: resolveApp('src/setupTests.js'),
appNodeModules: resolveApp('node_modules'),

View File

@ -1,5 +1,25 @@
const autoprefixer = require("autoprefixer");
const path = require("path");
const nodeExternals = require("webpack-node-externals");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const ManifestPlugin = require("webpack-manifest-plugin");
const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin");
const SWPrecacheWebpackPlugin = require("sw-precache-webpack-plugin");
const eslintFormatter = require("react-dev-utils/eslintFormatter");
const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
const TerserJSPlugin = require("terser-webpack-plugin");
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const TerserWebpackPlugin = require('terser-webpack-plugin');
const paths = require("./paths");
const getClientEnvironment = require("./env");
let publicPath = "/react/buildserver/";
// const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false";
const shouldUseSourceMap = true;
const env = getClientEnvironment(publicPath,'production.min');
// const nodeExternals = require("webpack-node-externals");
const serverConfig = {
target:"node", //由于输出代码的运行环境是node源码中依赖的node原生模块没必要打包进去为了不把nodejs内置模块打包进输出文件中例如 fs net模块等
@ -9,20 +29,242 @@ const serverConfig = {
filename:"bundle.js",
path: path.resolve(__dirname,"../buildserver")
},
externals:[nodeExternals()], //为了不把node_modules目录下的第三方模块打包进输出文件中,因为nodejs默认会去node_modules目录下去寻找和使用第三方模块。
module:{
rules:[
// externals:[nodeExternals()], //为了不把node_modules目录下的第三方模块打包进输出文件中,因为nodejs默认会去node_modules目录下去寻找和使用第三方模块。
module: {
strictExportPresence: true,
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
test: /\.(js|jsx|mjs)$/,
enforce: "pre",
use: [
{
options: {
formatter: eslintFormatter,
eslintPath: require.resolve("eslint"),
},
loader: require.resolve("eslint-loader"),
},
],
include: [paths.appSrc, paths.serverSrc],
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
// "oneOf" will traverse all following loaders until one will
// match the requirements. When no loader matches it will fall
// back to the "file" loader at the end of the loader list.
oneOf: [
// "url" loader works just like "file" loader but it also embeds
// assets smaller than specified size as data URLs to avoid requests.
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve("url-loader"),
options: {
limit: 10000,
name: "static/media/[name].[hash:8].[ext]",
},
},
{
test: /\.(js|jsx|mjs)$/,
include: [paths.appSrc, paths.serverSrc],
exclude: /node_modules/,
loader: require.resolve("babel-loader"),
options: {
compact: true,
plugins: [
[
"import",
{
libraryName: "antd",
libraryDirectory: "es",
style: true,
},
],
],
},
},
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath,
},
},
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
sourceMap: shouldUseSourceMap,
},
},
{
loader: require.resolve("postcss-loader"),
options: {
ident: "postcss",
plugins: () => [
require("postcss-flexbugs-fixes"),
autoprefixer({
browsers: [
">1%",
"last 4 versions",
"Firefox ESR",
"not ie < 9", // React doesn't support IE8 anyway
],
flexbox: "no-2009",
}),
],
},
},
],
},
{
test: /\.scss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath,
},
},
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
sourceMap: shouldUseSourceMap,
},
},
{
loader: require.resolve("sass-loader"),
},
{
loader: 'sass-resources-loader',
options: {
resources: ['src/global.scss']
}
}
],
},
{
test: /\.less$/,
use: [{
loader: 'isomorphic-style-loader',
}, {
loader: 'css-loader', // translates CSS into CommonJS
}, {
loader: 'less-loader', // compiles Less to CSS
options: {
modifyVars: {
'primary-color': '#466aff',
'link-color': '#466aff',
},
javascriptEnabled: true,
},
}]
},
// "file" loader makes sure assets end up in the `build` folder.
// When you `import` an asset, you get its filename.
// This loader doesn't use a "test" so it will catch all modules
// that fall through the other loaders.
{
loader: require.resolve("file-loader"),
// Exclude `js` files to keep "css" loader working as it injects
// it's runtime that would otherwise processed through "file" loader.
// Also exclude `html` and `json` extensions so they get processed
// by webpacks internal loaders.
exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],
options: {
name: "static/media/[name].[contenthash:8].[ext]",
},
},
// ** STOP ** Are you adding a new loader?
// Make sure to add the new loader(s) before the "file" loader.
],
},
]
}
],
},
plugins: [
// Makes some environment variables available in index.html.
// The public URL is available as %PUBLIC_URL% in index.html, e.g.:
// <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
// In production, it will be an empty string unless you specify "homepage"
// in `package.json`, in which case it will be the pathname of that URL.
// Generates an `index.html` file with the <script> injected.
new HtmlWebpackPlugin({
inject: false,
template: paths.appHtml,
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
}),
new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
// Makes some environment variables available to the JS code, for example:
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
// It is absolutely essential that NODE_ENV was set to production here.
// Otherwise React will be compiled in the very slow development mode.
new webpack.DefinePlugin(env.stringified),
new MiniCssExtractPlugin({
filename: "static/css/[name].[contenthash:8].css",
chunkFilename: "static/css/[name].[contenthash:8].chunk.css",
}),
// Generate a manifest file which contains a mapping of all asset filenames
// to their corresponding output file so that tools can pick it up without
// having to parse `index.html`.
new ManifestPlugin({
fileName: "asset-manifest.json",
}),
// Generate a service worker script that will precache, and keep up to date,
// the HTML & assets that are part of the Webpack build.
// new SWPrecacheWebpackPlugin({
// // By default, a cache-busting query parameter is appended to requests
// // used to populate the caches, to ensure the responses are fresh.
// // If a URL is already hashed by Webpack, then there is no concern
// // about it being stale, and the cache-busting can be skipped.
// dontCacheBustUrlsMatching: /\.\w{8}\./,
// filename: "service-worker.js",
// logger(message) {
// if (message.indexOf("Total precache size is") === 0) {
// // This message occurs for every build and is a bit too noisy.
// return;
// }
// if (message.indexOf("Skipping static resource") === 0) {
// // This message obscures real errors so we ignore it.
// // https://github.com/facebookincubator/create-react-app/issues/2612
// return;
// }
// // console.log(message);
// },
// minify: true,
// // For unknown URLs, fallback to the index page
// navigateFallback: publicUrl + "/index.html",
// // Ignores URLs starting from /__ (useful for Firebase):
// // https://github.com/facebookincubator/create-react-app/issues/2237#issuecomment-302693219
// navigateFallbackWhitelist: [/^(?!\/__).*/],
// // Don't precache sourcemaps (they're large) and build asset manifest:f
// staticFileGlobsIgnorePatterns: [/\.map$/, /asset-manifest\.json$/],
// }),
// Moment.js is an extremely popular library that bundles large locale files
// by default due to how Webpack interprets its code. This is a practical
// solution that requires the user to opt into importing specific locales.
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
// You can remove this if you don't use Moment.js:
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
new MonacoWebpackPlugin({
features: ["coreCommands", "find"],
languages: ['plaintext','apex', 'azcli', 'bat', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dockerfile', 'fsharp', 'go', 'handlebars', 'html', 'ini', 'java', 'javascript', 'json', 'less', 'lua', 'markdown', 'msdax', 'mysql', 'objective', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'r', 'razor', 'redis', 'redshift', 'ruby', 'rust', 'sb', 'scheme', 'scss', 'shell', 'solidity', 'sql', 'st', 'swift', 'typescript', 'vb', 'xml', 'yaml']
}),
new webpack.NamedChunksPlugin(),
new webpack.HashedModuleIdsPlugin(),
],
};
module.exports = serverConfig;

55
package-lock.json generated
View File

@ -1718,7 +1718,7 @@
},
"babel-cli": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
"resolved": "https://registry.npmmirror.com/babel-cli/-/babel-cli-6.26.0.tgz",
"integrity": "sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q==",
"dev": true,
"requires": {
@ -1741,7 +1741,7 @@
"dependencies": {
"chokidar": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-1.7.0.tgz",
"integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==",
"dev": true,
"optional": true,
@ -1759,7 +1759,7 @@
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"dev": true
}
@ -1784,7 +1784,7 @@
},
"babel-core": {
"version": "6.26.3",
"resolved": "http://173.15.15.82:8081/repository/npm-all/babel-core/-/babel-core-6.26.3.tgz",
"resolved": "https://registry.npmmirror.com/babel-core/-/babel-core-6.26.3.tgz",
"integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
"requires": {
"babel-code-frame": "^6.26.0",
@ -1815,8 +1815,8 @@
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
}
}
},
@ -2053,6 +2053,11 @@
"babel-runtime": "^6.22.0"
}
},
"babel-plugin-antd": {
"version": "0.5.1",
"resolved": "https://registry.npmmirror.com/babel-plugin-antd/-/babel-plugin-antd-0.5.1.tgz",
"integrity": "sha512-ypP7yH/m0qdCxa6VJIN86jLeC5jD6Rsp+uZM9+cfvzw8lD8nv30Ci31+APw4a1uecoiTkm/QQ/LC+KEOpn0r4Q=="
},
"babel-plugin-check-es2015-constants": {
"version": "6.22.0",
"resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
@ -2192,7 +2197,7 @@
},
"babel-plugin-transform-class-properties": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
"resolved": "https://registry.npmmirror.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
"integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==",
"dev": true,
"requires": {
@ -2481,6 +2486,16 @@
"babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-imports": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/babel-plugin-transform-imports/-/babel-plugin-transform-imports-2.0.0.tgz",
"integrity": "sha512-65ewumYJ85QiXdcB/jmiU0y0jg6eL6CdnDqQAqQ8JMOKh1E52VPG3NJzbVKWcgovUR5GBH8IWpCXQ7I8Q3wjgw==",
"dev": true,
"requires": {
"@babel/types": "^7.4",
"is-valid-path": "^0.1.1"
}
},
"babel-plugin-transform-object-rest-spread": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
@ -8209,7 +8224,7 @@
},
"fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "http://173.15.15.82:8081/repository/npm-all/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
"resolved": "https://registry.npmmirror.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
"integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
"dev": true
},
@ -10045,6 +10060,15 @@
"is-path-inside": "^1.0.0"
}
},
"is-invalid-path": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
"integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==",
"dev": true,
"requires": {
"is-glob": "^2.0.0"
}
},
"is-mobile": {
"version": "2.2.2",
"resolved": "http://173.15.15.82:8081/repository/npm-all/is-mobile/-/is-mobile-2.2.2.tgz",
@ -10230,6 +10254,15 @@
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
"integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q=="
},
"is-valid-path": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/is-valid-path/-/is-valid-path-0.1.1.tgz",
"integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==",
"dev": true,
"requires": {
"is-invalid-path": "^0.1.0"
}
},
"is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@ -12512,7 +12545,7 @@
},
"output-file-sync": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
"resolved": "https://registry.npmmirror.com/output-file-sync/-/output-file-sync-1.1.2.tgz",
"integrity": "sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==",
"dev": true,
"requires": {
@ -19499,7 +19532,7 @@
},
"user-home": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
"resolved": "https://registry.npmmirror.com/user-home/-/user-home-1.1.1.tgz",
"integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==",
"dev": true
},
@ -19559,7 +19592,7 @@
},
"v8flags": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
"resolved": "https://registry.npmmirror.com/v8flags/-/v8flags-2.1.1.tgz",
"integrity": "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==",
"dev": true,
"requires": {

View File

@ -13,6 +13,7 @@
"array-flatten": "^2.1.2",
"autoprefixer": "7.1.6",
"axios": "^0.24.0",
"babel-plugin-antd": "^0.5.1",
"bizcharts": "^3.5.8",
"bundle-loader": "^0.5.6",
"chalk": "1.1.3",
@ -124,8 +125,8 @@
"ana": "webpack-bundle-analyzer ./stats.json",
"analyze": "npm run build -- --stats && webpack-bundle-analyzer build/bundle-stats.json",
"analyz": "NODE_ENV=production npm_config_report=true npm run build",
"server": "cross-env NODE_ENV=production nodemon --exec node \"./buildserver/bundle.js\" --watch config --watch server",
"build:server": "webpack --config config/webpack.server.js"
"server": "cross-env NODE_ENV=production nodemon --exec babel-node \"./buildserver/bundle.js\" --watch config --watch server",
"build:server": "cross-env NODE_ENV=production webpack --config config/webpack.server.js"
},
"jest": {
"collectCoverageFrom": [
@ -161,24 +162,6 @@
"node"
]
},
"babel": {
"presets": [
"react",
"react-app"
],
"plugins": [
[
"import",
{
"libraryName": "antd",
"libraryDirectory": "lib",
"style": "css"
},
"ant"
],
"syntax-dynamic-import"
]
},
"eslintConfig": {
"extends": "react-app"
},
@ -187,13 +170,15 @@
"devDependencies": {
"@babel/runtime": "7.0.0-beta.51",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-core": "^6.26.3",
"babel-eslint": "7.2.3",
"babel-jest": "20.0.3",
"babel-loader": "7.1.2",
"babel-plugin-import": "^1.13.0",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-decorators-legacy": "^1.3.5",
"babel-plugin-transform-imports": "^2.0.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.7.0",

View File

@ -8,4 +8,7 @@ app.get('*',function (req,res) {
render(req,res);
})
app.listen(3000);
const port = 3000
console.log(`\n==> 🌎 Listening on port ${port}. Open up http://localhost:${port}/ in your browser.\n`)
app.listen(port);