| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- "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;
|