Ts09组件库打包

111 阅读1分钟

样式的架构

packages/theme - 这个项目分离开 BEM
mixins
    config.scss // 放一些全局配置相关的内容
        $namespace: 'z'; // 命名空间
        $status: 'is-';  // 状态
        $sep: '--';      // 状态权限
        $bk: '__';       // 元素分割
common
    var.scss   // 全局类的
        @import "../mixins/config.scss"; // 把全局的配置引入
        // 定义全局颜色
        
        // 变量组合使用
        .#{$a + '-' + $b} {
        
        }
        
        @mixin b($block) {
            $B:$namespace+'-'+$block;
            .#{$B} {
                $content // 调用代码中的内容。
            }
        }
        
        @include b(button) {
            color:red // $content和插槽一样 就是这段代码
        }
        
        @at-root 放到跟上 .a{.b{.c{.d{@at-root{a}}}}}
        
        .#{&+'xx'} &代表最近的那层
        
fonts
    iconfont
    font-class 多一些 下载完事
    更多操作编辑项目
    配置一些名字
    FontClass 前缀默认是icon-
    改成z-icon
    font-family
    z-ui-icons
        css
            eot 可以不用为了兼容IE9
            woff2
            bas64  这一堆都不要
            这个css要放到icon组件里面去
            保留
            【woff】
            【truetype】
            用的时候需要额外在加个样式 <i class="z-ui-icons xxx" /> 每个都需要多家 z-ui-icons
            修改带font-family的那段
            [class^="#{$namespace + '-icon-'}"]
            .ttf
            .woff 
            直接放到fonts里面记得在iconfont.scss修改路径
scss
    button.scss
    icon.scss
        iconfont.scss的样式放到这里

icon.vue 如何使用?
    <i :class="z-icon-${name}" />
    
样式入口放到哪里?
            创建index.scss
            @import "./icon.scss"
            @import "./button.scss"
            
            
// 采用bem规范
// z-xxx__header
// z-xxx--status

搭建一个组件的浏览css的

// 在website
// 在用之前需要在项目根目录yarn install 会把 theme也放到node_modules
// 注意theme是一个用lerna创建的
// 创建package.json
{
    name: "theme",
    version: '1.0.0'
}
main.ts 引入 index.scss

这个scss需要单独的打包

// 用gulp去打包css
// yarn add gulp gulp-autoprefixer gulp-cssmin gulp-dart-sass gulp-rename -D -W  gulp 图省事可以用方便打包个css js等等 

gulpfile.js

const { series, sre, dest } = require('gulp')
const sass = require( 'gulp-dart-sass")
const autoprefixer = require( 'gulp-autoprefixer")
const éssmin = require( 'gulp-essmin")

function compile() { // 处理5css文件
    return src('./src/*.scss')
        .pipe(sass.sync ())
        .pipe(autoprefixer ({}))
        .pipe(cssmin())
        .pipe(dest('./lib'))
}
function copyfont()( 11 拷贝字体样式
    return src('./src/fonts/**').pipe(cssmin()).pipe(dest('./lib/fonts'))
}

exports.build = series(compile, copyfont)

// theme下面所有内容放到src下面方便打包 

// 修改package.json scripts

"build:theme": "gulp build --gulpfile ./packages/theme/gulpfile.js" // 会给每一个scss都打包一下

如何用lerna打包组件库

打包 umd es 按需加载

// 需要三套配置文件
// 跟目录创建build
UMD
// build/webpack.config.js
// webpack.config.js 全部打包

const path = require("path");
const {VueLoaderPlugin} = require("vue-loader")
module.exports = {
    mode: "production",
    entry: path.resolve(__dirname, '../packages/z-ui/index.ts'),
    output: {
        path: path.resolve(__diranem, '../lib'),
        filename: 'index.js',
        libraryTarget: 'umd', // commonjs amd 不支持 esm 可以在浏览器用
        library: 'z-ui', 
    },
    externals: { // 忽略在代码中引用的vue变量  xx from "vue" 用到了这个东西不需要打包 排除完了到爆是非常小的
        vue: {
            root: 'Vue', // 跟的就是大写的  全局引入的是Vue Vue({})
            commomjs: 'vue', // 代码引入的是小vue  xxx from "vue" 
            commonjs2: 'vue',
        }
    }
    ,
     // 可以解析哪些类型
    resolve: { // 解析模块对应的扩展名 倒入的时候支持哪些后缀处理是loader处的
        extensions: [
            '.vue',
            '.ts',
            '.tsx',
            '.js'
        ]
    },
    module: {
        rules: [
            {
                test: /\.(t|j)sx?$/,
                exclude: /node_modules/,
                loader: 'babel-loader', // 创建.babelrc.js module.exports = { 
                    presets: [ '@babel/preset-env', "@babel/preset-typescript" ] // babel的预舍反着执行 先搞typescript -> @babel/preset-env高级语法转低级语法
                }
            },
            {
                test: /\.vue$ /,
                loader: 'vue-loader' // 这个逼玩意需要配合一个插件
            },


        ]
    },
    plugins: [

        new VueLoaderPlugin({})
    ]
}

// package.json
// preDependsxxx 告诉你项目需要的依赖没啥实际意义。
// scripts webpack --config ../build/webpack.config.js
// 按需加载babel-import-plugin
// 按需加载的前提是是组件的每一个都需要打包出来 
// demo 一下
import ZUI from "./lib/index.js"上面打包后的产物

如何用esm?

// 用rollup打包
yarn add rollup rollup-plugin-typescript2 rollup/plugin-node-resolve rollup-plugin-vue -D -W

rollup.config.js
    import typescript from 'rollup-plugin-typescript2';
    import { nodeResolve } from '@rollup/plugin-node-resolve';
    import path from 'path';
    import { getPackagesSyne } from '@lerna/project'; // 可以获取所有包的名字
    import vue from 'rollup-plugin-vue';
    // 获取packages目录下面所有的package.json 拿到了所有的打包名字
    const inputs = getPackagesSync().map(pck => pck.name).filter(name => name.
includes ('@z-ui"));

    export default {
        // 入口
        input: path.resolve(__dirname, `../packages/z-ui/index.ts`),

        output: {
            format: 'es',           // 打包个什么
            file: lib/index.esm.js  // 打包到哪里去
        }, 

        plugins: [
            nodeResolve(),
            vue({
                target: 'browser'
            }), 
            typescript ({ // 默认调用tsconfig.json 配置文件里面有生成声明文件这个玩意会帮助我们生成声明文件
                tsconfigOverride:{
                    exclude: [ // 排除 node_modules 和 website
                        'node modules',
                        'website'
                    ]
                }
            })
        ],
        external(id) {
            return /^vue/.test(id)
        }
    }
    
    // 组件的本身不需要样式所以也就没有样式相关的配置。
    
    // scripts
    "build:rollupesm": "rollup -c ./build/rollup.config.js"
    // 这个是打包所有的esm到index.esm.js
    
    // deom 
    import ZUI from "./lib/index.esm.js"

按照组件去打包

rollup.config.spiesm.js

import typescript from 'rollup-plugin-typescript2';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import path from 'path';
import { getPackagesSyne } from '@lerna/project'; // 可以获取所有包的名字
import vue from 'rollup-plugin-vue';

const inputs = getPackagesSync().map(pck => pck.name).filter(name => name.
includes ('@z-ui"));
    export default inputs.map(name=>{
        const pckNmae = name.split('@z-ui')[1];

        input: path.resolve(__dirname, `../packages/${pckNmae}/index.ts`),

        output: {
            format: 'es',           // 打包个什么
            file: `lib/${pckNmae}.esm.js`  // 打包到哪里去
        },

        plugins: [
            nodeResolve(),
            vue({
                target: 'browser'
            }), 
            typescript ({ // 默认调用tsconfig.json 配置文件里面有生成声明文件这个玩意会帮助我们生成声明文件
                tsconfigOverride:{
                   compilerOptions: {
                    declaration: false, // 不需要在生成声明文件
                   },
                   exclude: ['node_modules']
                }
            })
        ],

         external(id) {
            return /^vue/.test(id) || /^@z-ui/.test(id) // /^@z-ui/.test(id) 忽略自己写的组件因为外边已经打包了
        }

    })

    "build:rollupesm": "rollup -c ./build/rollup.config.spiesm.js"

    // demo 
    import ZUI from "./lib/button/xx.ems.js"