1
+ const path = require ( 'path' ) ;
2
+ const fs = require ( 'fs' ) ;
3
+
4
+ const CopyPlugin = require ( 'copy-webpack-plugin' ) ;
5
+ const HtmlWebpackPlugin = require ( 'html-webpack-plugin' ) ;
6
+ const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
7
+ const NodePolyfillPlugin = require ( 'node-polyfill-webpack-plugin' ) ;
8
+
9
+ const TsconfigPathsPlugin = require ( 'tsconfig-paths-webpack-plugin' ) ;
10
+ const webpack = require ( 'webpack' ) ;
11
+ const OptimizeCSSAssetsPlugin = require ( 'optimize-css-assets-webpack-plugin' ) ;
12
+ const TerserJSPlugin = require ( 'terser-webpack-plugin' ) ;
13
+ const product = require ( "../../product.json" ) ;
14
+ const tsConfigPath = path . join ( __dirname , '../../tsconfig.json' ) ;
15
+ const srcDir = path . join ( __dirname , '../../src/web/browser' ) ;
16
+ const distDir = path . join ( __dirname , '../../out' ) ;
17
+ const publicDir = path . join ( __dirname , '../../public' ) ;
18
+
19
+ const styleLoader =
20
+ process . env . NODE_ENV === 'production' ? MiniCssExtractPlugin . loader : require . resolve ( 'style-loader' ) ;
21
+ const isDevelopment =
22
+ process . env [ 'NODE_ENV' ] === 'development' || process . env [ 'NODE_ENV' ] === 'dev' ;
23
+
24
+ const port = 8080 ;
25
+
26
+ const idePkg = JSON . parse (
27
+ fs
28
+ . readFileSync (
29
+ path . join ( __dirname , '../..' , './node_modules/@opensumi/ide-core-browser/package.json' ) ,
30
+ )
31
+ . toString ( ) ,
32
+ ) ;
33
+
34
+ /** @type { import('webpack').Configuration } */
35
+ module . exports = {
36
+ entry : path . join ( srcDir , './index.ts' ) ,
37
+ output : {
38
+ filename : 'bundle.js' ,
39
+ path : distDir ,
40
+ } ,
41
+ cache : {
42
+ type : 'filesystem' ,
43
+ } ,
44
+
45
+ resolve : {
46
+ extensions : [ '.ts' , '.tsx' , '.js' , '.json' , '.less' ] ,
47
+ plugins : [
48
+ new TsconfigPathsPlugin ( {
49
+ configFile : tsConfigPath ,
50
+ } ) ,
51
+ ] ,
52
+ fallback : {
53
+ net : false ,
54
+ path : false ,
55
+ os : false ,
56
+ crypto : false ,
57
+ child_process : false ,
58
+ url : false ,
59
+ fs : false ,
60
+ } ,
61
+ } ,
62
+ mode : process . env [ 'NODE_ENV' ] ,
63
+ devtool : 'source-map' ,
64
+ module : {
65
+ // https://github.com/webpack/webpack/issues/196#issuecomment-397606728
66
+ exprContextCritical : false ,
67
+ rules : [
68
+ {
69
+ test : / \. t s x ? $ / ,
70
+ loader : 'ts-loader' ,
71
+ options : {
72
+ happyPackMode : true ,
73
+ transpileOnly : true ,
74
+ configFile : tsConfigPath ,
75
+ compilerOptions : {
76
+ target : 'es2016' ,
77
+ } ,
78
+ } ,
79
+ } ,
80
+ {
81
+ test : / \. p n g $ / ,
82
+ type : 'asset/resource' ,
83
+ } ,
84
+
85
+ {
86
+ test : / \. c s s $ / ,
87
+ use : [ styleLoader , 'css-loader' ] ,
88
+ } ,
89
+ {
90
+ test : / \. m o d u l e .l e s s $ / ,
91
+ use : [
92
+ styleLoader ,
93
+ {
94
+ loader : 'css-loader' ,
95
+ options : {
96
+ sourceMap : true ,
97
+ modules : {
98
+ localIdentName : '[local]___[hash:base64:5]' ,
99
+ } ,
100
+ } ,
101
+ } ,
102
+ {
103
+ loader : 'less-loader' ,
104
+ options : {
105
+ lessOptions : {
106
+ javascriptEnabled : true ,
107
+ } ,
108
+ } ,
109
+ } ,
110
+ ] ,
111
+ } ,
112
+ {
113
+ test : / ^ ( (? ! \. m o d u l e ) .) * l e s s $ / ,
114
+ use : [
115
+ styleLoader ,
116
+ {
117
+ loader : 'css-loader' ,
118
+ } ,
119
+ {
120
+ loader : 'less-loader' ,
121
+ options : {
122
+ lessOptions : {
123
+ javascriptEnabled : true ,
124
+ } ,
125
+ } ,
126
+ } ,
127
+ ] ,
128
+ } ,
129
+ {
130
+ test : / \. s v g $ / ,
131
+ type : 'asset/resource' ,
132
+ generator : {
133
+ filename : 'images/[name].[hash][ext][query]' ,
134
+ } ,
135
+ } ,
136
+ {
137
+ test : / \. ( w o f f ( 2 ) ? | t t f | e o t ) ( \? v = \d + \. \d + \. \d + ) ? $ / ,
138
+ type : 'asset/resource' ,
139
+ generator : {
140
+ filename : 'fonts/[name]-[hash:8][ext][query]' ,
141
+ } ,
142
+ } ,
143
+ ] ,
144
+ } ,
145
+ resolveLoader : {
146
+ modules : [ path . join ( __dirname , '../../node_modules' ) ] ,
147
+ extensions : [ '.ts' , '.tsx' , '.js' , '.json' , '.less' ] ,
148
+ mainFields : [ 'loader' , 'main' ] ,
149
+ } ,
150
+ plugins : [
151
+ new HtmlWebpackPlugin ( {
152
+ template : path . join ( publicDir , 'index.html' ) ,
153
+ } ) ,
154
+ new MiniCssExtractPlugin ( {
155
+ filename : '[name].[chunkhash:8].css' ,
156
+ chunkFilename : '[id].css' ,
157
+ } ) ,
158
+ ! process . env . CI && new webpack . ProgressPlugin ( ) ,
159
+ new NodePolyfillPlugin ( {
160
+ includeAliases : [ 'path' , 'Buffer' , 'process' ] ,
161
+ } ) ,
162
+ new webpack . DefinePlugin ( {
163
+ __PRODUCT__ : JSON . stringify ( product ) ,
164
+ 'process.env.WORKSPACE_DIR' : JSON . stringify (
165
+ isDevelopment ? path . join ( __dirname , '../..' , 'workspace' ) : process . env [ 'WORKSPACE_DIR' ] ,
166
+ ) ,
167
+ 'process.env.EXTENSION_DIR' : JSON . stringify (
168
+ isDevelopment ? path . join ( __dirname , '../..' , 'extensions' ) : process . env [ 'EXTENSION_DIR' ] ,
169
+ ) ,
170
+ 'process.env.REVERSION' : JSON . stringify ( idePkg . version || 'alpha' ) ,
171
+ 'process.env.DEVELOPMENT' : JSON . stringify ( ! ! isDevelopment ) ,
172
+ 'process.env.TEMPLATE_TYPE' : JSON . stringify (
173
+ isDevelopment ? process . env [ 'TEMPLATE_TYPE' ] : 'standard' ,
174
+ ) ,
175
+ } ) ,
176
+ new CopyPlugin ( {
177
+ patterns : [ {
178
+ from : publicDir ,
179
+ to : distDir ,
180
+ filter : ( filepath ) => {
181
+ console . log ( "filepath" , filepath ) ;
182
+ return ! filepath . endsWith ( 'index.html' )
183
+ }
184
+ } ]
185
+ } ) ,
186
+
187
+ ] ,
188
+ optimization : {
189
+ nodeEnv : process . env . NODE_ENV ,
190
+ minimizer : [
191
+ new TerserJSPlugin ( {
192
+ minify : TerserJSPlugin . esbuildMinify ,
193
+
194
+ } ) ,
195
+ new OptimizeCSSAssetsPlugin ( { } ) ,
196
+ ] ,
197
+ } ,
198
+ devServer : {
199
+ static : {
200
+ directory : path . join ( __dirname , '../../out' ) , // 静态文件目录
201
+ } ,
202
+ port,
203
+ host : '0.0.0.0' ,
204
+ headers : {
205
+ 'Access-Control-Allow-Origin' : '*' ,
206
+ 'Access-Control-Allow-Methods' : 'GET, POST, PUT, DELETE, PATCH, OPTIONS' ,
207
+ 'Access-Control-Allow-Headers' : 'X-Requested-With, content-type, Authorization' ,
208
+ } ,
209
+ open : true ,
210
+ client : {
211
+ overlay : {
212
+ errors : true ,
213
+ warnings : false ,
214
+ runtimeErrors : false ,
215
+ } ,
216
+ } ,
217
+ }
218
+
219
+ } ;
0 commit comments