135 lines
5.1 KiB
JavaScript
135 lines
5.1 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.assetFileNamesToFileName = exports.uniCssPlugin = void 0;
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const path_1 = __importDefault(require("path"));
|
|
const vite_1 = require("vite");
|
|
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
|
const shared_1 = require("@vue/shared");
|
|
function isCombineBuiltInCss(config) {
|
|
return config.command === 'build' && config.build.cssCodeSplit;
|
|
}
|
|
function uniCssPlugin() {
|
|
let resolvedConfig;
|
|
let file = '';
|
|
let fileName = '';
|
|
return {
|
|
name: 'uni:h5-css',
|
|
apply: 'build',
|
|
enforce: 'pre',
|
|
configResolved(config) {
|
|
resolvedConfig = config;
|
|
file = path_1.default.join(process.env.UNI_INPUT_DIR, 'uni.css');
|
|
},
|
|
async generateBundle() {
|
|
if (!isCombineBuiltInCss(resolvedConfig) || !uni_cli_shared_1.buildInCssSet.size) {
|
|
return;
|
|
}
|
|
// 生成框架css(需要排序,避免生成不一样的内容)
|
|
const content = await (0, uni_cli_shared_1.minifyCSS)(generateBuiltInCssCode([...uni_cli_shared_1.buildInCssSet].sort()), resolvedConfig);
|
|
// @ts-ignore 'Buffer' only refers to a type, but is being used as a value here
|
|
const contentHash = (0, uni_cli_shared_1.getAssetHash)(Buffer.from(content, 'utf-8'));
|
|
const assetFileNames = path_1.default.posix.join(resolvedConfig.build.assetsDir, '[name].[hash][extname]');
|
|
fileName = assetFileNamesToFileName(assetFileNames, file, contentHash, content);
|
|
const name = (0, vite_1.normalizePath)(path_1.default.relative(resolvedConfig.root, file));
|
|
this.emitFile({
|
|
name,
|
|
fileName,
|
|
type: 'asset',
|
|
source: content,
|
|
});
|
|
},
|
|
transformIndexHtml: {
|
|
enforce: 'post',
|
|
transform() {
|
|
if (!fileName) {
|
|
return;
|
|
}
|
|
// 追加框架css
|
|
return [
|
|
{
|
|
tag: 'link',
|
|
attrs: {
|
|
rel: 'stylesheet',
|
|
href: toPublicPath(fileName, resolvedConfig),
|
|
},
|
|
injectTo: 'head-prepend',
|
|
},
|
|
];
|
|
},
|
|
},
|
|
};
|
|
}
|
|
exports.uniCssPlugin = uniCssPlugin;
|
|
function toPublicPath(filename, config) {
|
|
return (0, uni_cli_shared_1.isExternalUrl)(filename) ? filename : config.base + filename;
|
|
}
|
|
function generateBuiltInCssCode(cssImports) {
|
|
return cssImports
|
|
.map((cssImport) => fs_1.default.readFileSync((0, uni_cli_shared_1.resolveBuiltIn)(cssImport), 'utf8'))
|
|
.join('\n');
|
|
}
|
|
/**
|
|
* converts the source filepath of the asset to the output filename based on the assetFileNames option. \
|
|
* this function imitates the behavior of rollup.js. \
|
|
* https://rollupjs.org/guide/en/#outputassetfilenames
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* const content = Buffer.from('text');
|
|
* const fileName = assetFileNamesToFileName(
|
|
* 'assets/[name].[hash][extname]',
|
|
* '/path/to/file.txt',
|
|
* getAssetHash(content),
|
|
* content
|
|
* )
|
|
* // fileName: 'assets/file.982d9e3e.txt'
|
|
* ```
|
|
*
|
|
* @param assetFileNames filename pattern. e.g. `'assets/[name].[hash][extname]'`
|
|
* @param file filepath of the asset
|
|
* @param contentHash hash of the asset. used for `'[hash]'` placeholder
|
|
* @param content content of the asset. passed to `assetFileNames` if `assetFileNames` is a function
|
|
* @returns output filename
|
|
*/
|
|
function assetFileNamesToFileName(assetFileNames, file, contentHash, content) {
|
|
const basename = path_1.default.basename(file);
|
|
// placeholders for `assetFileNames`
|
|
// `hash` is slightly different from the rollup's one
|
|
const extname = path_1.default.extname(basename);
|
|
const ext = extname.slice(1);
|
|
const name = basename.slice(0, -extname.length);
|
|
const hash = contentHash;
|
|
if ((0, shared_1.isFunction)(assetFileNames)) {
|
|
assetFileNames = assetFileNames({
|
|
name: file,
|
|
source: content,
|
|
type: 'asset',
|
|
});
|
|
if (!(0, shared_1.isString)(assetFileNames)) {
|
|
throw new TypeError('assetFileNames must return a string');
|
|
}
|
|
}
|
|
else if (!(0, shared_1.isString)(assetFileNames)) {
|
|
throw new TypeError('assetFileNames must be a string or a function');
|
|
}
|
|
const fileName = assetFileNames.replace(/\[\w+\]/g, (placeholder) => {
|
|
switch (placeholder) {
|
|
case '[ext]':
|
|
return ext;
|
|
case '[extname]':
|
|
return extname;
|
|
case '[hash]':
|
|
return hash;
|
|
case '[name]':
|
|
return name;
|
|
}
|
|
throw new Error(`invalid placeholder ${placeholder} in assetFileNames "${assetFileNames}"`);
|
|
});
|
|
return fileName;
|
|
}
|
|
exports.assetFileNamesToFileName = assetFileNamesToFileName;
|