akfun 3.2.10 → 3.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -387,3 +387,17 @@ module.exports = {
387
387
  ...
388
388
  }
389
389
  ```
390
+
391
+ 16. 本地开启https服务
392
+ > 使用 https://localhost/index.html 访问当前项目。
393
+ ```bash
394
+ module.exports = {
395
+ ...
396
+ dev: {
397
+ ...
398
+ https: true, // 默认不开启
399
+ }
400
+ ...
401
+ }
402
+ ```
403
+ 备注:akfun使用自签名证书开启https服务,浏览器会提示安全性问题不能正常访问,需要进行如下设置,以 Chrome设置 为例:浏览器打开 Chrome://flags/#allow-insecure-localhost 后将其设置为Enabled。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akfun",
3
- "version": "3.2.10",
3
+ "version": "3.2.12",
4
4
  "description": "前端脚手架:支持Vue技术栈和react技术栈",
5
5
  "keywords": [
6
6
  "前端工程",
package/src/dev-server.js CHANGED
@@ -1,8 +1,11 @@
1
1
  const open = require('open');
2
2
  const ora = require('ora');
3
3
  const path = require('path');
4
+ const https = require('https');
5
+ const fs = require('fs');
4
6
  const express = require('express');
5
7
  const webpack = require('webpack');
8
+ const portfinder = require('portfinder');
6
9
  const checkVersion = require('./check-versions');
7
10
  const { createProxyMiddleware } = require('http-proxy-middleware');
8
11
  const { resolve } = require('./utils/pathUtils');
@@ -93,47 +96,62 @@ module.exports = function (akfunConfig, _consoleTag) {
93
96
  // handle fallback for HTML5 history API
94
97
  app.use(require('connect-history-api-fallback')());
95
98
 
96
- let _resolve;
97
- let _reject;
98
- const readyPromise = new Promise((resolve, reject) => {
99
- _resolve = resolve;
100
- _reject = reject;
101
- });
99
+ const afterCreateServerAction = (isHttps, port) => {
100
+ spinner.succeed(`${consoleTag}调试模式已开启!`);
101
+
102
+ process.env.PORT = port;
102
103
 
103
- let server;
104
- const portfinder = require('portfinder');
105
- portfinder.basePort = port;
104
+ const uri = isHttps
105
+ ? `https://${config.dev.hostname}`
106
+ : `http://${config.dev.hostname}:${port}`;
106
107
 
107
- console.log('\n> Starting dev server...');
108
+ console.log(`> Listening at ${uri}\n`);
108
109
 
109
- devMiddleware.waitUntilValid(() => {
110
- portfinder.getPort((err, port) => {
111
- if (err) {
112
- _reject(err);
110
+ // 打印当前环境中的首个html和css地址
111
+ const projPath = `${uri}${webpackConfig.output.publicPath}`;
112
+
113
+ let entryConfig = webpackConfig.entry || {}; // 获取构建入口配置
114
+ const entryFiles = (entryConfig && Object.keys(entryConfig)) || [];
115
+ if (entryFiles.length > 0) {
116
+ // 获取第一个入口文件
117
+ const filename = entryFiles[0];
118
+ console.info(
119
+ `当前运行脚本:\n ${projPath}${filename}.js\n当前运行样式[可能不存在]:\n${projPath}${filename}.css`
120
+ );
121
+ // 是否自动打开浏览器并跳转到第一个入口页面
122
+ if (!config.dev.closeHtmlWebpackPlugin && autoOpenBrowser) {
123
+ open(`${projPath}${filename}.html`, { wait: true });
113
124
  }
114
- spinner.succeed(`${consoleTag}调试模式已开启!`);
115
-
116
- process.env.PORT = port;
117
- const uri = `http://${config.dev.hostname}:${port}`;
118
- console.log(`> Listening at ${uri}\n`);
119
-
120
- // 打印当前环境中的首个html和css地址
121
- const projPath = `${uri}${webpackConfig.output.publicPath}`;
122
- let entryConfig = webpackConfig.entry || {}; // 获取构建入口配置
123
- const entryFiles = (entryConfig && Object.keys(entryConfig)) || [];
124
- if (entryFiles.length > 0) {
125
- // 获取第一个入口文件
126
- const filename = entryFiles[0];
127
- console.info(
128
- `当前运行脚本:\n ${projPath}${filename}.js\n当前运行样式[可能不存在]:\n${projPath}${filename}.css`
129
- );
130
- // 是否自动打开浏览器并跳转到第一个入口页面
131
- if (!config.dev.closeHtmlWebpackPlugin && autoOpenBrowser) {
132
- open(`${projPath}${filename}.html`, { wait: true });
125
+ }
126
+ };
127
+
128
+ if (config.dev.https) {
129
+ const sslOptions = {
130
+ key: fs.readFileSync(path.resolve(__dirname, './ssl/localhost.key')),
131
+ cert: fs.readFileSync(path.resolve(__dirname, './ssl/localhost.cert')),
132
+ requestCert: false,
133
+ rejectUnauthorized: false
134
+ };
135
+
136
+ var httpsServer = https.createServer(sslOptions, app);
137
+
138
+ devMiddleware.waitUntilValid(() => {
139
+ httpsServer.listen(443, () => {
140
+ afterCreateServerAction(true, port);
141
+ });
142
+ });
143
+ } else {
144
+ portfinder.basePort = port;
145
+ devMiddleware.waitUntilValid(() => {
146
+ portfinder.getPort((err, port) => {
147
+ if (err) {
148
+ _reject(err);
133
149
  }
134
- }
135
- server = app.listen(port);
136
- _resolve();
150
+
151
+ app.listen(port, () => {
152
+ afterCreateServerAction(false, port);
153
+ });
154
+ });
137
155
  });
138
- });
156
+ }
139
157
  };
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDjDCCAnQCCQD3lQP0Gtul0TANBgkqhkiG9w0BAQsFADCBhzELMAkGA1UEBhMC
3
+ emgxETAPBgNVBAgMCHdpYmV0dGVyMREwDwYDVQQHDAh3aWJldHRlcjERMA8GA1UE
4
+ CgwId2liZXR0ZXIxDjAMBgNVBAsMBWFrZnVuMQ4wDAYDVQQDDAVha2Z1bjEfMB0G
5
+ CSqGSIb3DQEJARYQMzY1NTMzMDkzQHFxLmNvbTAeFw0yMjEwMDIxNjI2NDlaFw0y
6
+ MjExMDExNjI2NDlaMIGHMQswCQYDVQQGEwJ6aDERMA8GA1UECAwId2liZXR0ZXIx
7
+ ETAPBgNVBAcMCHdpYmV0dGVyMREwDwYDVQQKDAh3aWJldHRlcjEOMAwGA1UECwwF
8
+ YWtmdW4xDjAMBgNVBAMMBWFrZnVuMR8wHQYJKoZIhvcNAQkBFhAzNjU1MzMwOTNA
9
+ cXEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqbbSdHPvmurP
10
+ 7E3NmZRlqHJW+iAstgbKzlcOFUDNloNgT9SjhraJR343CSwXmGV+0dnGIoCeuSvL
11
+ erYIEQgDkgT4Mpnet1e0M8R332b78Xfw+aA/QTwx2DhwZcKOQ8gv6rPpYDjPpDWv
12
+ qliKarNIrEVBJiJVY9tuNDYoQBhKrkXQteTWSeU4p5SoMQwfra7NBp7wF/DqnSlz
13
+ U7+0LK6Tj4uOCYbV++1+5UQk7RyRBJVJlLC7DQT9LAyrcebnqdhalq8BjCa6idT5
14
+ d/ctEOnVrOwxL+/rQwhewbTUI986QsJXmmg3+r5WZU9lUJyL3vxXxffmT/rH0bJk
15
+ CC73GTOL1wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB856BWi1SC/c2jj17X2+T6
16
+ TzahZsXeoBkLKjR2EgUrrUIFTCS9SXslgOV5JG28zEn+pnh4ZW0KBls1ql2I31gy
17
+ vI/G55Y6bleNay9mYD5/7iclEXYb8olm6ipqS1cnRABpgDrI7Rh4T/sH6khXVgDR
18
+ xunLqZNEDrE92V3eEOAet0jnHTd2L+9Idz9TlPs3dW82J1bzBTld0Im53MWX64rm
19
+ a6axhRYrTzemSglL4Yjld0J8VVU/8ZE7IOZkxmcLB7UKXL2u9dkAKGV7iJsi0or5
20
+ X6yionKTPld5ud18MhZ/JDVWAMFISG2JlyXW8v1HEwkDo7PeIK05zOuDmSjgPiZz
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpttJ0c++a6s/s
3
+ Tc2ZlGWoclb6ICy2BsrOVw4VQM2Wg2BP1KOGtolHfjcJLBeYZX7R2cYigJ65K8t6
4
+ tggRCAOSBPgymd63V7QzxHffZvvxd/D5oD9BPDHYOHBlwo5DyC/qs+lgOM+kNa+q
5
+ WIpqs0isRUEmIlVj2240NihAGEquRdC15NZJ5TinlKgxDB+trs0GnvAX8OqdKXNT
6
+ v7QsrpOPi44JhtX77X7lRCTtHJEElUmUsLsNBP0sDKtx5uep2FqWrwGMJrqJ1Pl3
7
+ 9y0Q6dWs7DEv7+tDCF7BtNQj3zpCwleaaDf6vlZlT2VQnIve/FfF9+ZP+sfRsmQI
8
+ LvcZM4vXAgMBAAECggEAJ9qU5V/sXnbRyO4kX/JnRP1Ey4wOs9g4e+gZmIgVP0ku
9
+ rtCCbjojVrSe+/psuA7tjx4S1ztZCqbsK67fihBVtk6QcmGL2YYw/Q8gD0hB1dyS
10
+ rCwjbpBSLDJkwqDDg8tY5UbGgSAWMruguuH77z6WzE2fFPNvFfoLkRs+rH6H2xCM
11
+ GzlDMl71oym17LU+3Ie4fjoYpwRdFJBLQuCDbaatlVRpE01hX3T1JRvrU6Mmis8E
12
+ DBo0bKm0pIbeWcl9A4pbHy6GdClXO1UaI7uBNfWXyIc1V4Z5KHh+ZlPJVsnf4v70
13
+ aorUoIKnduYs6KAT1akko/O3jSQ2yziCff9UXpMDQQKBgQDVswXsD6ie9jwhhl82
14
+ Xf83GSDLsFeDDo3rFyCZtWgRKr1GTnoKQ0DO0w55H01OY3du+dARPS5QHf+MCku/
15
+ JIKFjdaYE1ZsATnPsCX9hiZ6QDVJPp2VPX3HkKhrR8198fLDriGng9pctxr15uy5
16
+ 62fgyIuydwyHEYNSdMCpn3nyZwKBgQDLTuZCoKrZ/5qUMzB2LFhfTUu53GM1cIKV
17
+ dUgAcoQrGPQ7jylULJv6IBkentOmEbQ+9P9T9w9PbxHmEoqk09vtB1qp5rxbGQ0/
18
+ ylFz6tytuoM+D+58f1e1c7+ZOOas1NbGCJD3V1SwXU1bPShG9ez8pNs6L/bv4n7A
19
+ Svmw4ggVEQKBgEiYCx/45cgyT5T356o5XjRiZeCr496SeCVvctSkaljCkw+qIw0P
20
+ cZmQ2u7Mcl95rJ3XYRYqGWx/9EqnSLoC9g/WchqxHv+Lnw7tgMpR4wpOe4uJKNEE
21
+ 1ZCQlJX1C1qIcXaF1crpIKm0TgVQ0AQMcvpKRiJ3DJtpmJnPLY+xrCRrAoGAGD5d
22
+ WN6d4QcI4NlF0yGwnBS0jgJI1kuHVtk4b804E4eTQDLvI7l6FBaVyD/6TxhXXRaM
23
+ B/AzJC7DfKMDY2pcFGTHG/GGznorSUsP8Xm1PQY7tj/iGXh59gpKc7QEVeG/hrfo
24
+ yYXhdHJ70gB1+BhFXU8vUT38/VgN81I9eilJ+3ECgYBQyDsoVvRvpmlWp9VQJs5v
25
+ DC8rufxGGbyiJpDxhtiE0gHKC+2DxU5IBG9hkQpjN4qqwR9HMwPeOvfs5cg0Loaf
26
+ IM3hwzVGQ39PZIY5grjmA5zPtdpuoCDX8DY/XhFmpmLThP3x5hGvTV6PXw31HOXX
27
+ OGT4LBgcYXktU99IC7x5pw==
28
+ -----END PRIVATE KEY-----