Spaces:
Sleeping
Sleeping
| const fs = require('fs') | |
| const path = require('path') | |
| module.exports = (api, { entry, name, formats, filename, 'inline-vue': inlineVue }, options) => { | |
| const { log, error } = require('@vue/cli-shared-utils') | |
| const abort = msg => { | |
| log() | |
| error(msg) | |
| process.exit(1) | |
| } | |
| const vueMajor = require('../../util/getVueMajor')(api.getCwd()) | |
| const fullEntryPath = api.resolve(entry) | |
| if (!fs.existsSync(fullEntryPath)) { | |
| abort( | |
| `Failed to resolve lib entry: ${entry}${entry === `src/App.vue` ? ' (default)' : ''}. ` + | |
| `Make sure to specify the correct entry file.` | |
| ) | |
| } | |
| const isVueEntry = /\.vue$/.test(entry) | |
| const libName = ( | |
| name || | |
| ( | |
| api.service.pkg.name | |
| ? api.service.pkg.name.replace(/^@.+\//, '') | |
| : path.basename(entry).replace(/\.(jsx?|vue)$/, '') | |
| ) | |
| ) | |
| filename = filename || libName | |
| function genConfig (format, postfix = format, genHTML) { | |
| const config = api.resolveChainableWebpackConfig() | |
| const browserslist = require('browserslist') | |
| const targets = browserslist(undefined, { path: fullEntryPath }) | |
| const supportsIE = targets.some(agent => agent.includes('ie')) | |
| const webpack = require('webpack') | |
| config.plugin('need-current-script-polyfill') | |
| .use(webpack.DefinePlugin, [{ | |
| 'process.env.NEED_CURRENTSCRIPT_POLYFILL': JSON.stringify(supportsIE) | |
| }]) | |
| // adjust css output name so they write to the same file | |
| if (config.plugins.has('extract-css')) { | |
| config | |
| .plugin('extract-css') | |
| .tap(args => { | |
| args[0].filename = `${filename}.css` | |
| return args | |
| }) | |
| } | |
| // only minify min entry | |
| if (!/\.min/.test(postfix)) { | |
| config.optimization.minimize(false) | |
| } | |
| // inject demo page for umd | |
| if (genHTML) { | |
| const template = isVueEntry ? 'demo-lib.html' : 'demo-lib-js.html' | |
| config | |
| .plugin('demo-html') | |
| .use(require('html-webpack-plugin'), [{ | |
| template: path.resolve(__dirname, template), | |
| inject: false, | |
| filename: 'demo.html', | |
| libName, | |
| vueMajor, | |
| assetsFileName: filename, | |
| cssExtract: config.plugins.has('extract-css') | |
| }]) | |
| } | |
| // resolve entry/output | |
| const entryName = `${filename}.${postfix}` | |
| config.resolve | |
| .alias | |
| .set('~entry', fullEntryPath) | |
| // set output target before user configureWebpack hooks are applied | |
| config.output.libraryTarget(format) | |
| // set entry/output after user configureWebpack hooks are applied | |
| const rawConfig = api.resolveWebpackConfig(config) | |
| let realEntry = require.resolve('./entry-lib.js') | |
| // avoid importing default if user entry file does not have default export | |
| if (!isVueEntry) { | |
| const entryContent = fs.readFileSync(fullEntryPath, 'utf-8') | |
| if (!/\b(export\s+default|export\s{[^}]+as\s+default)\b/.test(entryContent)) { | |
| realEntry = require.resolve('./entry-lib-no-default.js') | |
| } | |
| } | |
| // externalize Vue in case user imports it | |
| rawConfig.externals = [ | |
| ...(Array.isArray(rawConfig.externals) ? rawConfig.externals : [rawConfig.externals]), | |
| { | |
| ...(inlineVue || { | |
| vue: { | |
| commonjs: 'vue', | |
| commonjs2: 'vue', | |
| root: 'Vue' | |
| } | |
| }) | |
| } | |
| ].filter(Boolean) | |
| rawConfig.entry = { | |
| [entryName]: realEntry | |
| } | |
| rawConfig.output = Object.assign({ | |
| library: libName, | |
| libraryExport: isVueEntry ? 'default' : undefined, | |
| libraryTarget: format, | |
| // preserve UDM header from webpack 3 until webpack provides either | |
| // libraryTarget: 'esm' or target: 'universal' | |
| // https://github.com/webpack/webpack/issues/6522 | |
| // https://github.com/webpack/webpack/issues/6525 | |
| globalObject: `(typeof self !== 'undefined' ? self : this)` | |
| }, rawConfig.output, { | |
| filename: `${entryName}.js`, | |
| chunkFilename: `${entryName}.[name].js`, | |
| // use dynamic publicPath so this can be deployed anywhere | |
| // the actual path will be determined at runtime by checking | |
| // document.currentScript.src. | |
| publicPath: '' | |
| }) | |
| return rawConfig | |
| } | |
| const configMap = { | |
| commonjs: genConfig('commonjs2', 'common'), | |
| umd: genConfig('umd', undefined, true), | |
| 'umd-min': genConfig('umd', 'umd.min') | |
| } | |
| const formatArray = (formats + '').split(',') | |
| const configs = formatArray.map(format => configMap[format]) | |
| if (configs.indexOf(undefined) !== -1) { | |
| const unknownFormats = formatArray.filter(f => configMap[f] === undefined).join(', ') | |
| abort( | |
| `Unknown library build formats: ${unknownFormats}` | |
| ) | |
| } | |
| return configs | |
| } | |