@shijiu/jsview-vue 0.9.246 → 0.9.254
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/dom/bin/package.json +11 -11
- package/dom/browser-root-style.css +21 -21
- package/loader/jsview-main.js +41 -41
- package/loader/jsview.config.default.js +37 -37
- package/loader/jsview.default.config.js +37 -37
- package/package.json +6 -6
- package/patches/node_modules/@babel/preset-env/lib/available-plugins.js +218 -218
- package/patches/node_modules/@vue/cli-plugin-typescript/index.js +100 -100
- package/patches/node_modules/@vue/cli-service/lib/commands/serve.js +395 -395
- package/patches/node_modules/@vue/cli-service/lib/config/app.js +272 -272
- package/patches/node_modules/@vue/cli-service/lib/config/assets.js +70 -70
- package/patches/node_modules/@vue/cli-service/lib/config/base.js +212 -212
- package/patches/node_modules/postcss-js/objectifier.js +90 -90
- package/patches/node_modules/vue-loader/dist/resolveScript.js +70 -70
- package/samples/AdvanceMetroWidget/App.vue +122 -122
- package/samples/AdvanceMetroWidget/Frame.vue +100 -100
- package/samples/AdvanceMetroWidget/Item.vue +57 -57
- package/samples/AdvanceMetroWidget/data.js +136 -136
- package/samples/AnimPicture/App.vue +223 -223
- package/samples/Basic/App.vue +128 -128
- package/samples/Basic/components/TitleBar.vue +28 -28
- package/samples/Basic/components/anim/AnimGroup.vue +67 -67
- package/samples/Basic/components/anim/AnimKeyframeBasic.vue +101 -101
- package/samples/Basic/components/anim/AnimKeyframeComposite.vue +52 -52
- package/samples/Basic/components/anim/AnimTransition.vue +116 -116
- package/samples/Basic/components/div/DivBackground.vue +14 -14
- package/samples/Basic/components/div/DivClip.vue +80 -80
- package/samples/Basic/components/div/DivCssScoped.vue +26 -26
- package/samples/Basic/components/div/DivCssVar.vue +49 -49
- package/samples/Basic/components/div/DivGroup1.vue +32 -32
- package/samples/Basic/components/div/DivGroup2.vue +40 -40
- package/samples/Basic/components/div/DivLayout.vue +11 -11
- package/samples/Basic/components/div/DivRadius.vue +46 -46
- package/samples/Basic/components/text/TextAlign.vue +47 -47
- package/samples/Basic/components/text/TextFontStyle.vue +57 -57
- package/samples/Basic/components/text/TextGroup.vue +31 -31
- package/samples/Basic/components/text/TextOverflow.vue +77 -77
- package/samples/BasicFocusControl/App.vue +124 -124
- package/samples/BasicFocusControl/components/BaseBlock.vue +50 -50
- package/samples/BasicFocusControl/components/MainArea.vue +97 -97
- package/samples/BasicFocusControl/components/MainAreaLeftBlock.vue +20 -20
- package/samples/BasicFocusControl/components/MainAreaRightBlock.vue +29 -29
- package/samples/BasicFocusControl/components/SideBar.vue +72 -72
- package/samples/BasicFocusControl/components/SideBarBlock.vue +29 -29
- package/samples/ClassNameDemo/App.vue +119 -119
- package/samples/ClassNameDemo/components/ContentItem.vue +252 -252
- package/samples/ClassNameDemo/components/LoadingView.vue +43 -43
- package/samples/ClassNameDemo/components/TitleView.vue +24 -24
- package/samples/ClassNameDemo/data.js +24 -24
- package/samples/ColorSpace/App.vue +134 -134
- package/samples/DemoHomepage/App.vue +31 -31
- package/samples/DemoHomepage/components/BodyFrame.vue +81 -81
- package/samples/DemoHomepage/components/Dialog.vue +93 -93
- package/samples/DemoHomepage/components/Item.vue +76 -76
- package/samples/DemoHomepage/components/TabFrame.vue +86 -86
- package/samples/DemoHomepage/router.js +132 -132
- package/samples/DemoHomepage/views/Homepage.vue +186 -186
- package/samples/FlipCard/App.vue +80 -80
- package/samples/FlipCard/FlipCard.vue +123 -123
- package/samples/FlipCard/data.js +12 -12
- package/samples/FlowMultiWidget/App.vue +90 -90
- package/samples/FlowMultiWidget/components/Block.vue +106 -106
- package/samples/FlowMultiWidget/components/FlowPage.vue +59 -59
- package/samples/FlowMultiWidget/components/Item.vue +102 -102
- package/samples/FlowMultiWidget/components/MenuItem.vue +71 -71
- package/samples/FlowMultiWidget/components/MyMenu.vue +89 -89
- package/samples/FlowMultiWidget/data.js +446 -446
- package/samples/HashHistory/App.vue +124 -124
- package/samples/HashHistory/components/HorizontalButtonList.vue +113 -113
- package/samples/HashHistory/components/Item.vue +73 -73
- package/samples/HashHistory/router.js +29 -29
- package/samples/HashHistory/views/BasePage.vue +18 -18
- package/samples/HashHistory/views/MainPage.vue +67 -67
- package/samples/HashHistory/views/SubPage.vue +78 -78
- package/samples/HashHistory/views/SubPageFirst.vue +9 -9
- package/samples/HashHistory/views/SubPageSecond.vue +9 -9
- package/samples/LongImage/App.vue +96 -96
- package/samples/LongImage/Button.vue +153 -153
- package/samples/LongImage/LongImageScroll.vue +126 -126
- package/samples/LongImage/Scroll.vue +15 -15
- package/samples/LongText/App.vue +111 -111
- package/samples/LongText/Button.vue +153 -153
- package/samples/LongText/LongTextScroll.vue +224 -224
- package/samples/LongText/Scroll.vue +15 -15
- package/samples/Preload/App.vue +145 -145
- package/samples/Preload/data.js +22 -22
- package/samples/Preload/preloadItem.vue +21 -21
- package/samples/QrcodeDemo/App.vue +72 -72
- package/samples/SimpleWidgetDemo/App.vue +203 -203
- package/samples/SimpleWidgetDemo/Item.vue +82 -82
- package/samples/SimpleWidgetDemo/components/ContentItem.vue +411 -411
- package/samples/SimpleWidgetDemo/components/MyTab.vue +116 -116
- package/samples/SimpleWidgetDemo/data.js +110 -110
- package/samples/SprayView/App.vue +269 -269
- package/samples/SpriteImage/App.vue +174 -174
- package/samples/SpriteImage/images/egg_break.json +116 -116
- package/samples/TextBox/App.vue +178 -178
- package/samples/TextBox/RenderCenter.vue +108 -108
- package/samples/TextBox/RenderLeft.vue +108 -108
- package/samples/TextBox/RenderOneLine.vue +119 -119
- package/samples/TextBox/RenderRight.vue +106 -106
- package/samples/TextShadowDemo/App.vue +97 -97
- package/samples/TextureSize/App.vue +141 -141
- package/samples/ThrowMoveDemo/AccelerateDemo.vue +117 -117
- package/samples/ThrowMoveDemo/App.vue +113 -113
- package/samples/ThrowMoveDemo/LRParabolicDemo.vue +115 -115
- package/samples/ThrowMoveDemo/TargetDemo.vue +116 -116
- package/samples/ThrowMoveDemo/UDParabolicDemo.vue +121 -121
- package/samples/TransitPage/App.vue +40 -40
- package/samples/VideoDemo/App.vue +137 -137
- package/samples/VideoDemo/components/Button.vue +68 -68
- package/samples/VideoDemo/components/Controllor.vue +195 -195
- package/samples/VideoDemo/components/VideoFrame.vue +152 -152
- package/scripts/common.js +115 -92
- package/scripts/deploy-fast-pack.js +17 -0
- package/scripts/deploy-fast-publish.js +44 -0
- package/scripts/{git-commit-empty.js → deploy-git-commit-empty.js} +21 -21
- package/scripts/{pre-pack.js → deploy-prepare.js} +56 -39
- package/scripts/{install-local-packages.js → jsview-install-local-packages.js} +73 -73
- package/scripts/{post-build.js → jsview-post-build.js} +127 -127
- package/scripts/{post-install.js → jsview-post-install.js} +78 -78
- package/scripts/{run-android.js → jsview-run-android.js} +64 -64
- package/scripts/make-js.sh +181 -181
- package/utils/JsViewEngineWidget/bin/index.js +1 -1
- package/utils/JsViewEngineWidget/bin/package.json +11 -11
- package/utils/JsViewVueTools/JsvHashHistory.js +111 -111
- package/utils/JsViewVueTools/JsvRuntimeBridge.js +417 -417
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +80 -80
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserQrcode.vue +147 -147
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserSpray.vue +54 -54
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/ApicDataBase.js +28 -28
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/BrowserApic.vue +123 -123
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/GifData.js +83 -83
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/LoopToolBase.js +25 -25
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/NormalLoopTool.js +61 -61
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/PartLoopTool.js +119 -119
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/Viewer.js +106 -106
- package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/WebpData.js +141 -141
- package/utils/JsViewVueWidget/BrowserDebugWidget/WidgetLoader.js +20 -20
- package/utils/JsViewVueWidget/JsvActorMove/ActorControlBase.js +204 -204
- package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +63 -63
- package/utils/JsViewVueWidget/JsvActorMove/JsvActorMoveControl.js +426 -426
- package/utils/JsViewVueWidget/JsvActorMove/index.js +12 -12
- package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +178 -178
- package/utils/JsViewVueWidget/JsvApic/index.js +17 -17
- package/utils/JsViewVueWidget/JsvMarquee.vue +196 -196
- package/utils/JsViewVueWidget/JsvNinePatch.vue +76 -76
- package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +350 -350
- package/utils/JsViewVueWidget/JsvPreload/index.js +21 -21
- package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +140 -140
- package/utils/JsViewVueWidget/JsvQrcode/index.js +18 -18
- package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +139 -139
- package/utils/JsViewVueWidget/JsvSpray/index.js +14 -14
- package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +447 -447
- package/utils/JsViewVueWidget/JsvSpriteAnim/SpriteController.js +56 -56
- package/utils/JsViewVueWidget/JsvSpriteAnim/index.js +6 -6
- package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +34 -34
- package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +494 -494
- package/utils/JsViewVueWidget/JsvSwiper/index.js +9 -9
- package/utils/JsViewVueWidget/JsvSwiper3D/Indicator.vue +34 -34
- package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +403 -403
- package/utils/JsViewVueWidget/JsvSwiper3D/index.js +9 -9
- package/utils/JsViewVueWidget/JsvTextBox.vue +110 -110
- package/utils/JsViewVueWidget/JsvVideo.vue +35 -35
- package/vetur.config.js +5 -5
- package/.gitmodules +0 -6
- package/README.md +0 -15
- package/doc/IMPORT_CHANGE_LOG.txt +0 -3
- package/doc/about-project-postinstall.md +0 -0
- package/doc/git_commit.md +0 -15
- package/doc/test_version_up.txt +0 -1
- package/scripts/update-version.js +0 -32
- package/shijiu-jsview-vue-0.9.246.tgz +0 -0
|
@@ -1,272 +1,272 @@
|
|
|
1
|
-
// config that are specific to --target app
|
|
2
|
-
const fs = require('fs')
|
|
3
|
-
const path = require('path')
|
|
4
|
-
|
|
5
|
-
// ensure the filename passed to html-webpack-plugin is a relative path
|
|
6
|
-
// because it cannot correctly handle absolute paths
|
|
7
|
-
function ensureRelative (outputDir, _path) {
|
|
8
|
-
if (path.isAbsolute(_path)) {
|
|
9
|
-
return path.relative(outputDir, _path)
|
|
10
|
-
} else {
|
|
11
|
-
return _path
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
module.exports = (api, options) => {
|
|
16
|
-
api.chainWebpack(webpackConfig => {
|
|
17
|
-
// only apply when there's no alternative target
|
|
18
|
-
if (process.env.VUE_CLI_BUILD_TARGET && process.env.VUE_CLI_BUILD_TARGET !== 'app') {
|
|
19
|
-
return
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const isProd = process.env.NODE_ENV === 'production'
|
|
23
|
-
const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD
|
|
24
|
-
const outputDir = api.resolve(options.outputDir)
|
|
25
|
-
|
|
26
|
-
const getAssetPath = require('../util/getAssetPath')
|
|
27
|
-
const outputFilename = getAssetPath(
|
|
28
|
-
options,
|
|
29
|
-
`js/[name]${isLegacyBundle ? `-legacy` : ``}${isProd && options.filenameHashing ? '.[contenthash:8]' : ''}.js`
|
|
30
|
-
)
|
|
31
|
-
webpackConfig
|
|
32
|
-
.output
|
|
33
|
-
.filename(outputFilename)
|
|
34
|
-
.chunkFilename(outputFilename)
|
|
35
|
-
|
|
36
|
-
const webpack = require('webpack')
|
|
37
|
-
const { semver } = require('@vue/cli-shared-utils')
|
|
38
|
-
const webpackMajor = semver.major(webpack.version)
|
|
39
|
-
if (webpackMajor !== 4) {
|
|
40
|
-
// FIXME: a temporary workaround to get accurate contenthash in `applyLegacy`
|
|
41
|
-
// Should use a better fix per discussions at <https://github.com/jantimon/html-webpack-plugin/issues/1554#issuecomment-753653580>
|
|
42
|
-
webpackConfig.optimization
|
|
43
|
-
.set('realContentHash', false)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// code splitting
|
|
47
|
-
// QCode Removed >>>>>
|
|
48
|
-
// if (process.env.NODE_ENV !== 'test') {
|
|
49
|
-
// webpackConfig.optimization.splitChunks({
|
|
50
|
-
// cacheGroups: {
|
|
51
|
-
// defaultVendors: {
|
|
52
|
-
// name: `chunk-vendors`,
|
|
53
|
-
// test: /[\\/]node_modules[\\/]/,
|
|
54
|
-
// priority: -10,
|
|
55
|
-
// chunks: 'initial'
|
|
56
|
-
// },
|
|
57
|
-
// common: {
|
|
58
|
-
// name: `chunk-common`,
|
|
59
|
-
// minChunks: 2,
|
|
60
|
-
// priority: -20,
|
|
61
|
-
// chunks: 'initial',
|
|
62
|
-
// reuseExistingChunk: true
|
|
63
|
-
// }
|
|
64
|
-
// }
|
|
65
|
-
// })
|
|
66
|
-
// }
|
|
67
|
-
// QCode Removed <<<<<
|
|
68
|
-
|
|
69
|
-
// HTML plugin
|
|
70
|
-
const resolveClientEnv = require('../util/resolveClientEnv')
|
|
71
|
-
|
|
72
|
-
const htmlOptions = {
|
|
73
|
-
title: api.service.pkg.name,
|
|
74
|
-
scriptLoading: 'defer',
|
|
75
|
-
templateParameters: (compilation, assets, assetTags, pluginOptions) => {
|
|
76
|
-
// enhance html-webpack-plugin's built in template params
|
|
77
|
-
let stats
|
|
78
|
-
return Object.assign({
|
|
79
|
-
// make stats lazy as it is expensive
|
|
80
|
-
// TODO: not sure if it's still needed as of <https://github.com/jantimon/html-webpack-plugin/issues/780#issuecomment-390651831>
|
|
81
|
-
get webpack () {
|
|
82
|
-
return stats || (stats = compilation.getStats().toJson())
|
|
83
|
-
},
|
|
84
|
-
compilation: compilation,
|
|
85
|
-
webpackConfig: compilation.options,
|
|
86
|
-
htmlWebpackPlugin: {
|
|
87
|
-
tags: assetTags,
|
|
88
|
-
files: assets,
|
|
89
|
-
options: pluginOptions
|
|
90
|
-
}
|
|
91
|
-
}, resolveClientEnv(options, true /* raw */))
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// handle indexPath
|
|
96
|
-
if (options.indexPath !== 'index.html') {
|
|
97
|
-
// why not set filename for html-webpack-plugin?
|
|
98
|
-
// 1. It cannot handle absolute paths
|
|
99
|
-
// 2. Relative paths causes incorrect SW manifest to be generated (#2007)
|
|
100
|
-
webpackConfig
|
|
101
|
-
.plugin('move-index')
|
|
102
|
-
.use(require('../webpack/MovePlugin'), [
|
|
103
|
-
path.resolve(outputDir, 'index.html'),
|
|
104
|
-
path.resolve(outputDir, options.indexPath)
|
|
105
|
-
])
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// resolve HTML file(s)
|
|
109
|
-
const HTMLPlugin = require('html-webpack-plugin')
|
|
110
|
-
// const PreloadPlugin = require('@vue/preload-webpack-plugin')
|
|
111
|
-
const multiPageConfig = options.pages
|
|
112
|
-
const htmlPath = api.resolve('public/index.html')
|
|
113
|
-
const defaultHtmlPath = path.resolve(__dirname, 'index-default.html')
|
|
114
|
-
const publicCopyIgnore = ['**/.DS_Store']
|
|
115
|
-
|
|
116
|
-
if (!multiPageConfig) {
|
|
117
|
-
// default, single page setup.
|
|
118
|
-
htmlOptions.template = fs.existsSync(htmlPath)
|
|
119
|
-
? htmlPath
|
|
120
|
-
: defaultHtmlPath
|
|
121
|
-
|
|
122
|
-
publicCopyIgnore.push(api.resolve(htmlOptions.template).replace(/\\/g, '/'))
|
|
123
|
-
|
|
124
|
-
webpackConfig
|
|
125
|
-
.plugin('html')
|
|
126
|
-
.use(HTMLPlugin, [htmlOptions])
|
|
127
|
-
|
|
128
|
-
// FIXME: need to test out preload plugin's compatibility with html-webpack-plugin 4/5
|
|
129
|
-
// if (!isLegacyBundle) {
|
|
130
|
-
// // inject preload/prefetch to HTML
|
|
131
|
-
// webpackConfig
|
|
132
|
-
// .plugin('preload')
|
|
133
|
-
// .use(PreloadPlugin, [{
|
|
134
|
-
// rel: 'preload',
|
|
135
|
-
// include: 'initial',
|
|
136
|
-
// fileBlacklist: [/\.map$/, /hot-update\.js$/]
|
|
137
|
-
// }])
|
|
138
|
-
|
|
139
|
-
// webpackConfig
|
|
140
|
-
// .plugin('prefetch')
|
|
141
|
-
// .use(PreloadPlugin, [{
|
|
142
|
-
// rel: 'prefetch',
|
|
143
|
-
// include: 'asyncChunks'
|
|
144
|
-
// }])
|
|
145
|
-
// }
|
|
146
|
-
} else {
|
|
147
|
-
// multi-page setup
|
|
148
|
-
webpackConfig.entryPoints.clear()
|
|
149
|
-
|
|
150
|
-
const pages = Object.keys(multiPageConfig)
|
|
151
|
-
const normalizePageConfig = c => typeof c === 'string' ? { entry: c } : c
|
|
152
|
-
|
|
153
|
-
pages.forEach(name => {
|
|
154
|
-
const pageConfig = normalizePageConfig(multiPageConfig[name])
|
|
155
|
-
const {
|
|
156
|
-
entry,
|
|
157
|
-
template = `public/${name}.html`,
|
|
158
|
-
filename = `${name}.html`,
|
|
159
|
-
chunks = ['chunk-vendors', 'chunk-common', name]
|
|
160
|
-
} = pageConfig
|
|
161
|
-
|
|
162
|
-
// Currently Cypress v3.1.0 comes with a very old version of Node,
|
|
163
|
-
// which does not support object rest syntax.
|
|
164
|
-
// (https://github.com/cypress-io/cypress/issues/2253)
|
|
165
|
-
// So here we have to extract the customHtmlOptions manually.
|
|
166
|
-
const customHtmlOptions = {}
|
|
167
|
-
for (const key in pageConfig) {
|
|
168
|
-
if (
|
|
169
|
-
!['entry', 'template', 'filename', 'chunks'].includes(key)
|
|
170
|
-
) {
|
|
171
|
-
customHtmlOptions[key] = pageConfig[key]
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// inject entry
|
|
176
|
-
const entries = Array.isArray(entry) ? entry : [entry]
|
|
177
|
-
webpackConfig.entry(name).merge(entries.map(e => api.resolve(e)))
|
|
178
|
-
|
|
179
|
-
// trim inline loader
|
|
180
|
-
// * See https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md#2-setting-a-loader-directly-for-the-template
|
|
181
|
-
const templateWithoutLoader = template.replace(/^.+!/, '').replace(/\?.+$/, '')
|
|
182
|
-
|
|
183
|
-
// resolve page index template
|
|
184
|
-
const hasDedicatedTemplate = fs.existsSync(api.resolve(templateWithoutLoader))
|
|
185
|
-
const templatePath = hasDedicatedTemplate
|
|
186
|
-
? template
|
|
187
|
-
: fs.existsSync(htmlPath)
|
|
188
|
-
? htmlPath
|
|
189
|
-
: defaultHtmlPath
|
|
190
|
-
|
|
191
|
-
publicCopyIgnore.push(api.resolve(templateWithoutLoader).replace(/\\/g, '/'))
|
|
192
|
-
|
|
193
|
-
// inject html plugin for the page
|
|
194
|
-
const pageHtmlOptions = Object.assign(
|
|
195
|
-
{},
|
|
196
|
-
htmlOptions,
|
|
197
|
-
{
|
|
198
|
-
chunks,
|
|
199
|
-
template: templatePath,
|
|
200
|
-
filename: ensureRelative(outputDir, filename)
|
|
201
|
-
},
|
|
202
|
-
customHtmlOptions
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
webpackConfig
|
|
206
|
-
.plugin(`html-${name}`)
|
|
207
|
-
.use(HTMLPlugin, [pageHtmlOptions])
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
// FIXME: preload plugin is not compatible with webpack 5 / html-webpack-plugin 4 yet
|
|
211
|
-
// if (!isLegacyBundle) {
|
|
212
|
-
// pages.forEach(name => {
|
|
213
|
-
// const filename = ensureRelative(
|
|
214
|
-
// outputDir,
|
|
215
|
-
// normalizePageConfig(multiPageConfig[name]).filename || `${name}.html`
|
|
216
|
-
// )
|
|
217
|
-
// webpackConfig
|
|
218
|
-
// .plugin(`preload-${name}`)
|
|
219
|
-
// .use(PreloadPlugin, [{
|
|
220
|
-
// rel: 'preload',
|
|
221
|
-
// includeHtmlNames: [filename],
|
|
222
|
-
// include: {
|
|
223
|
-
// type: 'initial',
|
|
224
|
-
// entries: [name]
|
|
225
|
-
// },
|
|
226
|
-
// fileBlacklist: [/\.map$/, /hot-update\.js$/]
|
|
227
|
-
// }])
|
|
228
|
-
|
|
229
|
-
// webpackConfig
|
|
230
|
-
// .plugin(`prefetch-${name}`)
|
|
231
|
-
// .use(PreloadPlugin, [{
|
|
232
|
-
// rel: 'prefetch',
|
|
233
|
-
// includeHtmlNames: [filename],
|
|
234
|
-
// include: {
|
|
235
|
-
// type: 'asyncChunks',
|
|
236
|
-
// entries: [name]
|
|
237
|
-
// }
|
|
238
|
-
// }])
|
|
239
|
-
// })
|
|
240
|
-
// }
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// CORS and Subresource Integrity
|
|
244
|
-
if (options.crossorigin != null || options.integrity) {
|
|
245
|
-
webpackConfig
|
|
246
|
-
.plugin('cors')
|
|
247
|
-
.use(require('../webpack/CorsPlugin'), [{
|
|
248
|
-
crossorigin: options.crossorigin,
|
|
249
|
-
integrity: options.integrity,
|
|
250
|
-
publicPath: options.publicPath
|
|
251
|
-
}])
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// copy static assets in public/
|
|
255
|
-
const publicDir = api.resolve('public')
|
|
256
|
-
if (!isLegacyBundle && fs.existsSync(publicDir)) {
|
|
257
|
-
webpackConfig
|
|
258
|
-
.plugin('copy')
|
|
259
|
-
.use(require('copy-webpack-plugin'), [{
|
|
260
|
-
patterns: [{
|
|
261
|
-
from: publicDir,
|
|
262
|
-
to: outputDir,
|
|
263
|
-
toType: 'dir',
|
|
264
|
-
noErrorOnMissing: true,
|
|
265
|
-
globOptions: {
|
|
266
|
-
ignore: publicCopyIgnore
|
|
267
|
-
}
|
|
268
|
-
}]
|
|
269
|
-
}])
|
|
270
|
-
}
|
|
271
|
-
})
|
|
272
|
-
}
|
|
1
|
+
// config that are specific to --target app
|
|
2
|
+
const fs = require('fs')
|
|
3
|
+
const path = require('path')
|
|
4
|
+
|
|
5
|
+
// ensure the filename passed to html-webpack-plugin is a relative path
|
|
6
|
+
// because it cannot correctly handle absolute paths
|
|
7
|
+
function ensureRelative (outputDir, _path) {
|
|
8
|
+
if (path.isAbsolute(_path)) {
|
|
9
|
+
return path.relative(outputDir, _path)
|
|
10
|
+
} else {
|
|
11
|
+
return _path
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module.exports = (api, options) => {
|
|
16
|
+
api.chainWebpack(webpackConfig => {
|
|
17
|
+
// only apply when there's no alternative target
|
|
18
|
+
if (process.env.VUE_CLI_BUILD_TARGET && process.env.VUE_CLI_BUILD_TARGET !== 'app') {
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const isProd = process.env.NODE_ENV === 'production'
|
|
23
|
+
const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD
|
|
24
|
+
const outputDir = api.resolve(options.outputDir)
|
|
25
|
+
|
|
26
|
+
const getAssetPath = require('../util/getAssetPath')
|
|
27
|
+
const outputFilename = getAssetPath(
|
|
28
|
+
options,
|
|
29
|
+
`js/[name]${isLegacyBundle ? `-legacy` : ``}${isProd && options.filenameHashing ? '.[contenthash:8]' : ''}.js`
|
|
30
|
+
)
|
|
31
|
+
webpackConfig
|
|
32
|
+
.output
|
|
33
|
+
.filename(outputFilename)
|
|
34
|
+
.chunkFilename(outputFilename)
|
|
35
|
+
|
|
36
|
+
const webpack = require('webpack')
|
|
37
|
+
const { semver } = require('@vue/cli-shared-utils')
|
|
38
|
+
const webpackMajor = semver.major(webpack.version)
|
|
39
|
+
if (webpackMajor !== 4) {
|
|
40
|
+
// FIXME: a temporary workaround to get accurate contenthash in `applyLegacy`
|
|
41
|
+
// Should use a better fix per discussions at <https://github.com/jantimon/html-webpack-plugin/issues/1554#issuecomment-753653580>
|
|
42
|
+
webpackConfig.optimization
|
|
43
|
+
.set('realContentHash', false)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// code splitting
|
|
47
|
+
// QCode Removed >>>>>
|
|
48
|
+
// if (process.env.NODE_ENV !== 'test') {
|
|
49
|
+
// webpackConfig.optimization.splitChunks({
|
|
50
|
+
// cacheGroups: {
|
|
51
|
+
// defaultVendors: {
|
|
52
|
+
// name: `chunk-vendors`,
|
|
53
|
+
// test: /[\\/]node_modules[\\/]/,
|
|
54
|
+
// priority: -10,
|
|
55
|
+
// chunks: 'initial'
|
|
56
|
+
// },
|
|
57
|
+
// common: {
|
|
58
|
+
// name: `chunk-common`,
|
|
59
|
+
// minChunks: 2,
|
|
60
|
+
// priority: -20,
|
|
61
|
+
// chunks: 'initial',
|
|
62
|
+
// reuseExistingChunk: true
|
|
63
|
+
// }
|
|
64
|
+
// }
|
|
65
|
+
// })
|
|
66
|
+
// }
|
|
67
|
+
// QCode Removed <<<<<
|
|
68
|
+
|
|
69
|
+
// HTML plugin
|
|
70
|
+
const resolveClientEnv = require('../util/resolveClientEnv')
|
|
71
|
+
|
|
72
|
+
const htmlOptions = {
|
|
73
|
+
title: api.service.pkg.name,
|
|
74
|
+
scriptLoading: 'defer',
|
|
75
|
+
templateParameters: (compilation, assets, assetTags, pluginOptions) => {
|
|
76
|
+
// enhance html-webpack-plugin's built in template params
|
|
77
|
+
let stats
|
|
78
|
+
return Object.assign({
|
|
79
|
+
// make stats lazy as it is expensive
|
|
80
|
+
// TODO: not sure if it's still needed as of <https://github.com/jantimon/html-webpack-plugin/issues/780#issuecomment-390651831>
|
|
81
|
+
get webpack () {
|
|
82
|
+
return stats || (stats = compilation.getStats().toJson())
|
|
83
|
+
},
|
|
84
|
+
compilation: compilation,
|
|
85
|
+
webpackConfig: compilation.options,
|
|
86
|
+
htmlWebpackPlugin: {
|
|
87
|
+
tags: assetTags,
|
|
88
|
+
files: assets,
|
|
89
|
+
options: pluginOptions
|
|
90
|
+
}
|
|
91
|
+
}, resolveClientEnv(options, true /* raw */))
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// handle indexPath
|
|
96
|
+
if (options.indexPath !== 'index.html') {
|
|
97
|
+
// why not set filename for html-webpack-plugin?
|
|
98
|
+
// 1. It cannot handle absolute paths
|
|
99
|
+
// 2. Relative paths causes incorrect SW manifest to be generated (#2007)
|
|
100
|
+
webpackConfig
|
|
101
|
+
.plugin('move-index')
|
|
102
|
+
.use(require('../webpack/MovePlugin'), [
|
|
103
|
+
path.resolve(outputDir, 'index.html'),
|
|
104
|
+
path.resolve(outputDir, options.indexPath)
|
|
105
|
+
])
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// resolve HTML file(s)
|
|
109
|
+
const HTMLPlugin = require('html-webpack-plugin')
|
|
110
|
+
// const PreloadPlugin = require('@vue/preload-webpack-plugin')
|
|
111
|
+
const multiPageConfig = options.pages
|
|
112
|
+
const htmlPath = api.resolve('public/index.html')
|
|
113
|
+
const defaultHtmlPath = path.resolve(__dirname, 'index-default.html')
|
|
114
|
+
const publicCopyIgnore = ['**/.DS_Store']
|
|
115
|
+
|
|
116
|
+
if (!multiPageConfig) {
|
|
117
|
+
// default, single page setup.
|
|
118
|
+
htmlOptions.template = fs.existsSync(htmlPath)
|
|
119
|
+
? htmlPath
|
|
120
|
+
: defaultHtmlPath
|
|
121
|
+
|
|
122
|
+
publicCopyIgnore.push(api.resolve(htmlOptions.template).replace(/\\/g, '/'))
|
|
123
|
+
|
|
124
|
+
webpackConfig
|
|
125
|
+
.plugin('html')
|
|
126
|
+
.use(HTMLPlugin, [htmlOptions])
|
|
127
|
+
|
|
128
|
+
// FIXME: need to test out preload plugin's compatibility with html-webpack-plugin 4/5
|
|
129
|
+
// if (!isLegacyBundle) {
|
|
130
|
+
// // inject preload/prefetch to HTML
|
|
131
|
+
// webpackConfig
|
|
132
|
+
// .plugin('preload')
|
|
133
|
+
// .use(PreloadPlugin, [{
|
|
134
|
+
// rel: 'preload',
|
|
135
|
+
// include: 'initial',
|
|
136
|
+
// fileBlacklist: [/\.map$/, /hot-update\.js$/]
|
|
137
|
+
// }])
|
|
138
|
+
|
|
139
|
+
// webpackConfig
|
|
140
|
+
// .plugin('prefetch')
|
|
141
|
+
// .use(PreloadPlugin, [{
|
|
142
|
+
// rel: 'prefetch',
|
|
143
|
+
// include: 'asyncChunks'
|
|
144
|
+
// }])
|
|
145
|
+
// }
|
|
146
|
+
} else {
|
|
147
|
+
// multi-page setup
|
|
148
|
+
webpackConfig.entryPoints.clear()
|
|
149
|
+
|
|
150
|
+
const pages = Object.keys(multiPageConfig)
|
|
151
|
+
const normalizePageConfig = c => typeof c === 'string' ? { entry: c } : c
|
|
152
|
+
|
|
153
|
+
pages.forEach(name => {
|
|
154
|
+
const pageConfig = normalizePageConfig(multiPageConfig[name])
|
|
155
|
+
const {
|
|
156
|
+
entry,
|
|
157
|
+
template = `public/${name}.html`,
|
|
158
|
+
filename = `${name}.html`,
|
|
159
|
+
chunks = ['chunk-vendors', 'chunk-common', name]
|
|
160
|
+
} = pageConfig
|
|
161
|
+
|
|
162
|
+
// Currently Cypress v3.1.0 comes with a very old version of Node,
|
|
163
|
+
// which does not support object rest syntax.
|
|
164
|
+
// (https://github.com/cypress-io/cypress/issues/2253)
|
|
165
|
+
// So here we have to extract the customHtmlOptions manually.
|
|
166
|
+
const customHtmlOptions = {}
|
|
167
|
+
for (const key in pageConfig) {
|
|
168
|
+
if (
|
|
169
|
+
!['entry', 'template', 'filename', 'chunks'].includes(key)
|
|
170
|
+
) {
|
|
171
|
+
customHtmlOptions[key] = pageConfig[key]
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// inject entry
|
|
176
|
+
const entries = Array.isArray(entry) ? entry : [entry]
|
|
177
|
+
webpackConfig.entry(name).merge(entries.map(e => api.resolve(e)))
|
|
178
|
+
|
|
179
|
+
// trim inline loader
|
|
180
|
+
// * See https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md#2-setting-a-loader-directly-for-the-template
|
|
181
|
+
const templateWithoutLoader = template.replace(/^.+!/, '').replace(/\?.+$/, '')
|
|
182
|
+
|
|
183
|
+
// resolve page index template
|
|
184
|
+
const hasDedicatedTemplate = fs.existsSync(api.resolve(templateWithoutLoader))
|
|
185
|
+
const templatePath = hasDedicatedTemplate
|
|
186
|
+
? template
|
|
187
|
+
: fs.existsSync(htmlPath)
|
|
188
|
+
? htmlPath
|
|
189
|
+
: defaultHtmlPath
|
|
190
|
+
|
|
191
|
+
publicCopyIgnore.push(api.resolve(templateWithoutLoader).replace(/\\/g, '/'))
|
|
192
|
+
|
|
193
|
+
// inject html plugin for the page
|
|
194
|
+
const pageHtmlOptions = Object.assign(
|
|
195
|
+
{},
|
|
196
|
+
htmlOptions,
|
|
197
|
+
{
|
|
198
|
+
chunks,
|
|
199
|
+
template: templatePath,
|
|
200
|
+
filename: ensureRelative(outputDir, filename)
|
|
201
|
+
},
|
|
202
|
+
customHtmlOptions
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
webpackConfig
|
|
206
|
+
.plugin(`html-${name}`)
|
|
207
|
+
.use(HTMLPlugin, [pageHtmlOptions])
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
// FIXME: preload plugin is not compatible with webpack 5 / html-webpack-plugin 4 yet
|
|
211
|
+
// if (!isLegacyBundle) {
|
|
212
|
+
// pages.forEach(name => {
|
|
213
|
+
// const filename = ensureRelative(
|
|
214
|
+
// outputDir,
|
|
215
|
+
// normalizePageConfig(multiPageConfig[name]).filename || `${name}.html`
|
|
216
|
+
// )
|
|
217
|
+
// webpackConfig
|
|
218
|
+
// .plugin(`preload-${name}`)
|
|
219
|
+
// .use(PreloadPlugin, [{
|
|
220
|
+
// rel: 'preload',
|
|
221
|
+
// includeHtmlNames: [filename],
|
|
222
|
+
// include: {
|
|
223
|
+
// type: 'initial',
|
|
224
|
+
// entries: [name]
|
|
225
|
+
// },
|
|
226
|
+
// fileBlacklist: [/\.map$/, /hot-update\.js$/]
|
|
227
|
+
// }])
|
|
228
|
+
|
|
229
|
+
// webpackConfig
|
|
230
|
+
// .plugin(`prefetch-${name}`)
|
|
231
|
+
// .use(PreloadPlugin, [{
|
|
232
|
+
// rel: 'prefetch',
|
|
233
|
+
// includeHtmlNames: [filename],
|
|
234
|
+
// include: {
|
|
235
|
+
// type: 'asyncChunks',
|
|
236
|
+
// entries: [name]
|
|
237
|
+
// }
|
|
238
|
+
// }])
|
|
239
|
+
// })
|
|
240
|
+
// }
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// CORS and Subresource Integrity
|
|
244
|
+
if (options.crossorigin != null || options.integrity) {
|
|
245
|
+
webpackConfig
|
|
246
|
+
.plugin('cors')
|
|
247
|
+
.use(require('../webpack/CorsPlugin'), [{
|
|
248
|
+
crossorigin: options.crossorigin,
|
|
249
|
+
integrity: options.integrity,
|
|
250
|
+
publicPath: options.publicPath
|
|
251
|
+
}])
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// copy static assets in public/
|
|
255
|
+
const publicDir = api.resolve('public')
|
|
256
|
+
if (!isLegacyBundle && fs.existsSync(publicDir)) {
|
|
257
|
+
webpackConfig
|
|
258
|
+
.plugin('copy')
|
|
259
|
+
.use(require('copy-webpack-plugin'), [{
|
|
260
|
+
patterns: [{
|
|
261
|
+
from: publicDir,
|
|
262
|
+
to: outputDir,
|
|
263
|
+
toType: 'dir',
|
|
264
|
+
noErrorOnMissing: true,
|
|
265
|
+
globOptions: {
|
|
266
|
+
ignore: publicCopyIgnore
|
|
267
|
+
}
|
|
268
|
+
}]
|
|
269
|
+
}])
|
|
270
|
+
}
|
|
271
|
+
})
|
|
272
|
+
}
|