-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathwebpack.js
142 lines (138 loc) · 4.16 KB
/
webpack.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const WebpackDevServer = require('webpack-dev-server');
const webpack = require('webpack');
const path = require('path');
const fs = require('fs');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
require('colors');
/**
* 模式
* @type {'dev'|'build'}
*/
const mode = process.argv[2];
/**
* 通用配置
*/
let commonConfig = {
entry: ['./src/index.js'],
devtool: mode === 'dev' ? 'inline-source-map' : undefined,
mode: mode === 'dev' ? 'development' : 'production',
output: {
filename: 'gltfviewer/gltfviewer.js',
library: 'gltfviewer',
libraryTarget: 'umd',
path: path.resolve('./', 'dist')
},
performance: {
hints: false
},
plugins: [
new VueLoaderPlugin()
],
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env' // 转换es6 -> es5
],
plugins: [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
],
["@babel/plugin-proposal-decorators", { "legacy": true }], // 转换@装饰器
["@babel/plugin-proposal-class-properties", { "loose": true }], // 转换class语法
["@babel/plugin-transform-runtime"] // 特殊语法'aa'.includes('a'); 在require('@babel/polyfill')
]
},
include: path.resolve('./', 'src'),
exclude: '/node_modules/'
},
{
test: /\.vue$/,
use: 'vue-loader'
},
{
test: /\.css$/,
use: [
'vue-style-loader',
{
loader: 'css-loader',
options: {
esModule: false //必须设置false
}
}
]
},
{
test: /\.(woff|ttf)$/,
loader: 'file-loader',
options: {
name: 'gltfviewer/fonts/[name].[ext]'
}
},
{
test: /\.(txt|glsl|vert|frag|shader)$/i,
use: 'raw-loader',
},
]
}
};
mode === 'dev' ? dev() : build();
function dev() {
const port = 8080;
let devConfig = {
static: path.resolve('./', 'dist'),
port: port,
hot: true
};
let compiler = webpack(commonConfig);
//文件写入磁盘
compiler.hooks.watchRun.tap('watchRun', () => {
white('开始编译');
});
compiler.hooks.failed.tap('failed', error => {
red(`编译时发生错误,错误信息:${error}`);
});
compiler.hooks.emit.tap('emit', (compilation, callback) => {
const assets = compilation.assets;
let file, data;
Object.keys(assets).forEach(key => {
if (!key.startsWith('gltfviewer/')) return;//只写入js文件
file = path.resolve('./', 'dist', key);
data = assets[key].source();
fs.writeFileSync(file, data);
});
callback && callback();
});
compiler.hooks.afterEmit.tap('afterEmit', () => {
green('编译成功');
});
const server = new WebpackDevServer(compiler, devConfig);
server.listen(port);
}
function build() {
white('开始编译');
webpack(commonConfig, stats => {
if (stats) {
red(`编译发生错误,错误信息:${stats}`);
}
else {
green('编译成功');
}
});
}
function green(msg) {
console.log(`--------------------${msg}--------------------`.green);
}
function red(msg) {
console.log(`--------------------${msg}--------------------`.red);
}
function white(msg) {
console.log(`--------------------${msg}--------------------`.white);
}