diff --git a/package.json b/package.json index 4d6d16368..965ff4e6f 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,6 @@ "@types/fs-extra": "^9.0.13", "@types/gulp": "^4.0.9", "@types/inquirer": "^8.2.4", - "@types/less": "^3.0.3", "@types/lodash-es": "^4.17.6", "@types/marked": "^4.0.7", "@types/node": "^18.11.0", @@ -110,8 +109,6 @@ "jsdom": "^20.0.1", "lerna": "^5.6.2", "less": "^4.1.3", - "less-plugin-clean-css": "^1.5.1", - "less-plugin-npm-import": "^2.1.0", "lint-staged": "^13.0.3", "lodash-es": "^4.17.21", "markdownlint-cli": "^0.32.2", diff --git a/packages/components/default.full.less b/packages/components/default.full.less new file mode 100644 index 000000000..8456f676c --- /dev/null +++ b/packages/components/default.full.less @@ -0,0 +1,4 @@ +@import './style/core/reset.default.less'; +@import './style/core/reset-scroll.default.less'; + +@import './default.less'; diff --git a/packages/components/default.less b/packages/components/default.less index d24cd376d..5087049be 100644 --- a/packages/components/default.less +++ b/packages/components/default.less @@ -1,3 +1,5 @@ +@import '../cdk/index.less'; + @import './_private/collapse-transition/style/themes/default.less'; @import './_private/mask/style/themes/default.less'; @import './_private/overlay/style/themes/default.less'; diff --git a/packages/components/seer.full.less b/packages/components/seer.full.less new file mode 100644 index 000000000..e7fd22436 --- /dev/null +++ b/packages/components/seer.full.less @@ -0,0 +1,4 @@ +@import './style/core/reset.seer.less'; +@import './style/core/reset-scroll.seer.less'; + +@import './seer.less'; diff --git a/packages/components/seer.less b/packages/components/seer.less index 7b162b361..58f923a4b 100644 --- a/packages/components/seer.less +++ b/packages/components/seer.less @@ -1,3 +1,5 @@ +@import '../cdk/index.less'; + @import './_private/collapse-transition/style/themes/seer.less'; @import './_private/mask/style/themes/seer.less'; @import './_private/overlay/style/themes/seer.less'; diff --git a/packages/site/plugins/themePlugin.ts b/packages/site/plugins/themePlugin.ts index e2bb7e772..827dd8ab5 100644 --- a/packages/site/plugins/themePlugin.ts +++ b/packages/site/plugins/themePlugin.ts @@ -1,5 +1,5 @@ import { mkdirSync, readFileSync } from 'fs' -import { readFile, writeFile } from 'fs/promises' +import { writeFile } from 'fs/promises' import path from 'path' import { existsSync, writeFileSync } from 'fs-extra' @@ -83,7 +83,7 @@ export const themePlugin = (options?: Options): Plugin => { await Promise.all( options!.themes!.map(async theme => { const themeLess = themeLessContent.replace('themes/index', `themes/${theme.key}`) - await compile(themeLess, path.join(buildThemeDir, `${theme.key}.css`), true) + await compile(themeLess, path.join(buildThemeDir, `${theme.key}.css`)) }), ) }, diff --git a/packages/site/src/docs/CustomizeTheme.zh.md b/packages/site/src/docs/CustomizeTheme.zh.md index b042385aa..af624d91a 100644 --- a/packages/site/src/docs/CustomizeTheme.zh.md +++ b/packages/site/src/docs/CustomizeTheme.zh.md @@ -15,62 +15,36 @@ order: 5 - `default`: 默认主题 - `seer`: 安全主题 +默认的 `@idux/components/(default|seer).full.(css|less)` 文件中已经包含了内置的 `reset` 样式,如果不需要的话,可以替换成相应的 `@idux/components/(default|seer).(css|less)` 文件,同时应该提供最基础的 reset 样式,参见:[#1194](https://github.com/IDuxFE/idux/issues/1194). + ### 方式一: 使用 CSS 如果项目不使用 Less,可在入口的 CSS 文件(如:`style.css`)或者 ts 文件(如:`idux.ts`/`main.ts`)中,全量引入主题样式文件。 -CSS 文件中引入: - ```css /* 默认主题*/ -@import "@idux/components/default.min.css"; -@import "@idux/pro/default.min.css"; +@import "@idux/components/default.full.css"; +@import "@idux/pro/default.css"; /* 安全主题 */ -/* @import "@idux/components/seer.min.css" */ -/* @import "@idux/pro/seer.min.css" */ -``` - -ts 文件中引入: - -```ts -// 默认主题 -import "@idux/components/default.min.css"; -import "@idux/pro/default.min.css"; - -// 安全主题 -// import "@idux/components/seer.min.css" -// import "@idux/pro/seer.min.css" +/* @import "@idux/components/seer.full.css" */ +/* @import "@idux/pro/seer.css" */ ``` ### 方式二:使用 Less 可在入口的 Less 文件(如:`style.less`)或者 ts 文件(如:`idux.ts`/`main.ts`)中,全量引入主题样式文件, 同时还需要在构建工具中配置 less。 -Less 文件中引入: - ```less /* 默认主题*/ -@import "@idux/components/default.less"; +@import "@idux/components/default.full.less"; @import "@idux/pro/default.less"; /* 安全主题 */ -/* @import "@idux/components/seer.less" */ +/* @import "@idux/components/seer.full.less" */ /* @import "@idux/pro/seer.less" */ ``` -ts 文件中引入: - -```ts -// 默认主题 -import "@idux/components/default.less"; -import "@idux/pro/default.less"; - -// 安全主题 -// import "@idux/components/seer.less" -// import "@idux/pro/seer.less" -``` - 配置 less, 以 vite 为例,修改 `vite.config.ts`: ```ts diff --git a/packages/site/src/docs/Faq.zh.md b/packages/site/src/docs/Faq.zh.md index be5e23e23..a755e8c25 100644 --- a/packages/site/src/docs/Faq.zh.md +++ b/packages/site/src/docs/Faq.zh.md @@ -8,7 +8,7 @@ order: 10 请确认是否正确引入了组件样式,请参考: [快速上手](/docs/getting-started/zh) 和 [定制主题](/docs/customize-theme/zh) 进行一些必要的配置。 -需要强调的是,在没有特殊需求的情况下,请使用组件库提供的 reset 样式,`"@idux/components/style/core/reset.default.min.css"`。如果没有引入它,务必确认是否提供了必要的全局样式,参见[#1194](https://github.com/IDuxFE/idux/issues/1194)。 +需要强调的是,在没有特殊需求的情况下,请使用组件库提供的 reset 样式,`"@idux/components/style/core/reset.default.css"`。如果没有引入它,务必确认是否提供了必要的全局样式,参见[#1194](https://github.com/IDuxFE/idux/issues/1194)。 ## 无法通过 `useModal` 创建弹窗组件?(`useMessage`, `useDrawer`...) diff --git a/packages/site/src/docs/GettingStarted.zh.md b/packages/site/src/docs/GettingStarted.zh.md index 0a461593b..efd71f20c 100755 --- a/packages/site/src/docs/GettingStarted.zh.md +++ b/packages/site/src/docs/GettingStarted.zh.md @@ -45,24 +45,20 @@ npm install @idux/cdk @idux/components @idux/pro ### 初始化配置 -参考下面的代码,新建一个 `idux.ts` 文件,对 `@idux` 进行初始化配置,包括引入国际化文件,导入模块,引入样式文件等工作。 +参考下面的代码,新建一个 `idux.ts` 文件,对 `@idux` 进行初始化配置,包括引入国际化文件,导入模块,引入样式文件等工作。 ```ts // idux.ts import { type App } from "vue"; -// 导入 cdk 样式,注意是 `index`, 因为 cdk 不会区分主题 -import "@idux/cdk/index.min.css"; - -// 如果不需要 reset 全局样式,移除下一行代码,但是这可能导致部分组件样式异常,需要提供一些必须的全局样式 -// 参见:https://github.com/IDuxFE/idux/issues/1194 -import "@idux/components/style/core/reset.default.min.css"; -// 如果不需要 reset 滚动条样式,移除下一行代码 -import "@idux/components/style/core/reset-scroll.default.min.css"; - +// 示例导入的是 default 主题,如果需要使用其他主题或者定制主题,请参考定制主题的文档 // 如果需要 css 按需加载,移除下面 2 行代码 -import "@idux/components/default.min.css"; -import "@idux/pro/default.min.css"; +import "@idux/components/default.full.css"; +import "@idux/pro/default.css"; +// 如果需要 css 按需加载,则按需添加下面的代码 +// import "@idux/cdk/index.css"; +// import "@idux/components/style/core/reset.default.css"; +// import "@idux/components/style/core/reset-scroll.default.css"; // 如果需要 js 按需加载,移除下面 3 行代码 import IduxCdk from "@idux/cdk"; @@ -134,17 +130,11 @@ export default defineConfig({ 我们提供了所有组件的类型定义,你可以参考下面的代码进行导入类型声明。 ```ts -// vite-env.d.ts +// env.d.ts /// /// /// /// - -declare module "*.vue" { - import type { DefineComponent } from "vue"; - const component: DefineComponent<{}, {}, any>; - export default component; -} ``` ### 文档提示 @@ -171,7 +161,7 @@ npm run dev 当你只用到 `@idux` 的部分组件且比较在意包体积大小时,可以只加载用到的组件。 -推荐仅按需加载 js 代码,css 代码无需按需加载, 首先你需要修改 `idux.ts` 中的代码。 +推荐**仅按需加载 js 代码**,css 代码无需按需加载, 首先你需要修改 `idux.ts` 中的代码。 ```diff - import IduxCdk from "@idux/cdk"; @@ -199,9 +189,9 @@ export default defineConfig({ /* ... */ Components({ resolvers: [IduxResolver()], - // 可以通过指定 `importStyle` 来按需加载 css 或 less 代码 - // 别忘了移除掉 idux.ts 中的样式导入代码 - // resolvers: [IduxResolver({ importStyle: 'css' })], + // 可以通过指定 `importStyle` 来按需加载 css 或 less 代码, 也支持不同的主题 + // 别忘了修改 idux.ts 中的样式导入代码 + // resolvers: [IduxResolver({ importStyle: 'css', importStyleTheme: 'default' })], }), ] }) diff --git a/packages/site/src/global/codesandbox.ts b/packages/site/src/global/codesandbox.ts index 5bfabe8b0..097675cd2 100644 --- a/packages/site/src/global/codesandbox.ts +++ b/packages/site/src/global/codesandbox.ts @@ -110,8 +110,8 @@ import IduxCdk from '@idux/cdk'; import IduxComponents from '@idux/components'; import IduxPro from '@idux/pro'; -import '@idux/components/default.min.css'; -import '@idux/pro/default.min.css'; +import '@idux/components/default.css'; +import '@idux/pro/default.css'; import { createGlobalConfig } from "@idux/components/config"; import { diff --git a/packages/site/src/styles/themes/default.less b/packages/site/src/styles/themes/default.less index 2f601dcb3..29a583caa 100644 --- a/packages/site/src/styles/themes/default.less +++ b/packages/site/src/styles/themes/default.less @@ -1,9 +1,2 @@ -// @import '@idux/components/style/core/reset.default.less'; -// @import '@idux/components/style/core/reset-scroll.default.less'; -// @import '@idux/components/default.less'; -// @import '@idux/pro/default.less'; - -@import '../../../../components/style/core/reset.default.less'; -@import '../../../../components/style/core/reset-scroll.default.less'; -@import '../../../../components/default.less'; +@import '../../../../components/default.full.less'; @import '../../../../pro/default.less'; diff --git a/packages/site/src/styles/themes/seer.less b/packages/site/src/styles/themes/seer.less index e7c0d9cd6..94d5a5fe4 100644 --- a/packages/site/src/styles/themes/seer.less +++ b/packages/site/src/styles/themes/seer.less @@ -1,9 +1,2 @@ -// @import '@idux/components/style/core/reset.seer.less'; -// @import '@idux/components/style/core/reset-scroll.seer.less'; -// @import '@idux/components/seer.less'; -// @import '@idux/pro/seer.less'; - -@import '../../../../components/style/core/reset.seer.less'; -@import '../../../../components/style/core/reset-scroll.seer.less'; -@import '../../../../components/seer.less'; +@import '../../../../components/seer.full.less'; @import '../../../../pro/seer.less'; diff --git a/scripts/gulp/build/less.ts b/scripts/gulp/build/less.ts index 05814ea75..965c79895 100644 --- a/scripts/gulp/build/less.ts +++ b/scripts/gulp/build/less.ts @@ -1,36 +1,28 @@ import path from 'path' import { copy, copyFile, pathExists, readFile, readdirSync, remove, writeFile } from 'fs-extra' -import less from 'less' -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import LessPluginCleanCSS from 'less-plugin-clean-css' -// eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore -import NpmImportPlugin from 'less-plugin-npm-import' +import less from 'less' import { gulpConfig } from '../gulpConfig' const { themes } = gulpConfig.build -export async function compile(content: string, savePath: string, min: boolean, rootPath?: string): Promise { - const plugins: Less.Plugin[] = [] - if (min) { - plugins.push(new LessPluginCleanCSS({ advanced: true })) - } +export async function compile(content: string, savePath: string, rootPath?: string): Promise { + const plugins: any[] = [] - const lessOptions: Less.Options = { plugins, javascriptEnabled: true } + const lessOptions: any = { plugins, javascriptEnabled: true } if (rootPath) { lessOptions.paths = [path.dirname(rootPath)] lessOptions.filename = rootPath - plugins.push(new NpmImportPlugin({ prefix: '~' })) } return less .render(content, lessOptions) - .then(({ css }) => writeFile(savePath, css)) - .catch(err => Promise.reject(err)) + .then(({ css }: any) => writeFile(savePath, css)) + .catch((err: any) => Promise.reject(err)) } function compileTheme(content: string, saveDirname: string, themeName: string) { @@ -60,7 +52,7 @@ export async function compileLess( const lessPath = `${styleDirname}/themes/${themeName}.less` const lessContent = await readFile(lessPath, { encoding: 'utf8' }) - promiseList.push(compile(lessContent, path.join(outputDirname, `themes/${themeName}.css`), false, lessPath)) + promiseList.push(compile(lessContent, path.join(outputDirname, `themes/${themeName}.css`), lessPath)) const themePath = `${styleDirname}/themes/${themeName}.ts` const themeContent = await readFile(themePath, { encoding: 'utf8' }) @@ -78,7 +70,7 @@ export async function compileLess( await copy(styleDirname, outputDirname) const lessPath = `${styleDirname}/index.less` const lessContent = await readFile(lessPath, { encoding: 'utf8' }) - promiseList.push(compile(lessContent, path.join(outputDirname, `index.css`), false, lessPath)) + promiseList.push(compile(lessContent, path.join(outputDirname, `index.css`), lessPath)) } // handler private components @@ -102,27 +94,24 @@ export async function compileLess( if (packageName === 'cdk') { await copyFile(`${targetDirname}/index.less`, `${distDirname}/index.less`) const entryContent = `@import "${path.posix.join(distDirname, 'index.less')}";` - promiseList.push(compile(entryContent, path.join(distDirname, `index.css`), false)) - promiseList.push(compile(entryContent, path.join(distDirname, `index.min.css`), true)) + promiseList.push(compile(entryContent, path.join(distDirname, `index.css`))) } else { // Compile concentrated less file to CSS file. await copy(path.resolve(targetDirname, 'style'), path.resolve(distDirname, 'style')) for (const theme of themes) { await copyFile(`${targetDirname}/${theme}.less`, `${distDirname}/${theme}.less`) const entryContent = `@import "${path.posix.join(distDirname, theme + '.less')}";` - promiseList.push(compile(entryContent, path.join(distDirname, `${theme}.css`), false)) - promiseList.push(compile(entryContent, path.join(distDirname, `${theme}.min.css`), true)) + promiseList.push(compile(entryContent, path.join(distDirname, `${theme}.css`))) // Compile css file that doesn't have component-specific styles. if (packageName === 'components') { + await copyFile(`${targetDirname}/${theme}.full.less`, `${distDirname}/${theme}.full.less`) + const entryFullContent = `@import "${path.posix.join(distDirname, theme + '.full.less')}";` + promiseList.push(compile(entryFullContent, path.join(distDirname, `${theme}.full.css`))) + const resetPath = path.join(targetDirname, 'style/core', `reset.${theme}.less`) const resetContent = await readFile(resetPath, { encoding: 'utf8' }) - promiseList.push( - compile(resetContent, path.join(distDirname, 'style/core', `reset.${theme}.css`), false, resetPath), - ) - promiseList.push( - compile(resetContent, path.join(distDirname, 'style/core', `reset.${theme}.min.css`), true, resetPath), - ) + promiseList.push(compile(resetContent, path.join(distDirname, 'style/core', `reset.${theme}.css`), resetPath)) const resetScrollPath = path.join(targetDirname, 'style/core', `reset-scroll.${theme}.less`) const resetScrollContent = await readFile(resetScrollPath, { encoding: 'utf8' }) @@ -130,15 +119,6 @@ export async function compileLess( compile( resetScrollContent, path.join(distDirname, 'style/core', `reset-scroll.${theme}.css`), - false, - resetScrollPath, - ), - ) - promiseList.push( - compile( - resetScrollContent, - path.join(distDirname, 'style/core', `reset-scroll.${theme}.min.css`), - true, resetScrollPath, ), )