feat(cli): gen package entry in lib dir

This commit is contained in:
陈嘉涵 2019-12-11 16:27:32 +08:00
parent 2fd09f52b0
commit 29e9e1c476
5 changed files with 60 additions and 17 deletions

View File

@ -1,4 +1,4 @@
import { join } from 'path'; import { join, relative } from 'path';
import { clean } from './clean'; import { clean } from './clean';
import { remove, copy, readdirSync } from 'fs-extra'; import { remove, copy, readdirSync } from 'fs-extra';
import { compileJs } from '../compiler/compile-js'; import { compileJs } from '../compiler/compile-js';
@ -21,7 +21,7 @@ import {
setModuleEnv setModuleEnv
} from '../common'; } from '../common';
const stepper = getStepper(8); const stepper = getStepper(10);
async function compileDir(dir: string) { async function compileDir(dir: string) {
const files = readdirSync(dir); const files = readdirSync(dir);
@ -59,8 +59,8 @@ async function buildESModuleOutputs() {
stepper.start('Build ESModule Outputs'); stepper.start('Build ESModule Outputs');
try { try {
await copy(SRC_DIR, ES_DIR);
setModuleEnv('esmodule'); setModuleEnv('esmodule');
await copy(SRC_DIR, ES_DIR);
await compileDir(ES_DIR); await compileDir(ES_DIR);
stepper.success('Build ESModule Outputs'); stepper.success('Build ESModule Outputs');
} catch (err) { } catch (err) {
@ -72,8 +72,8 @@ async function buildCommonjsOutputs() {
stepper.start('Build Commonjs Outputs'); stepper.start('Build Commonjs Outputs');
try { try {
await copy(SRC_DIR, LIB_DIR);
setModuleEnv('commonjs'); setModuleEnv('commonjs');
await copy(SRC_DIR, LIB_DIR);
await compileDir(LIB_DIR); await compileDir(LIB_DIR);
stepper.success('Build Commonjs Outputs'); stepper.success('Build Commonjs Outputs');
} catch (err) { } catch (err) {
@ -97,7 +97,7 @@ async function buildPackedOutputs() {
stepper.start('Build Packed Outputs'); stepper.start('Build Packed Outputs');
try { try {
genPackageEntry(); setModuleEnv('esmodule');
await compilePackage(false); await compilePackage(false);
await compilePackage(true); await compilePackage(true);
stepper.success('Build Packed Outputs'); stepper.success('Build Packed Outputs');
@ -106,11 +106,35 @@ async function buildPackedOutputs() {
} }
} }
async function buildPackageEntry() {
stepper.start('Build Package Entry');
try {
const esEntryFile = join(ES_DIR, 'index.js');
const libEntryFile = join(LIB_DIR, 'index.js');
genPackageEntry({
outputPath: esEntryFile,
pathResolver: (path: string) => `./${relative(SRC_DIR, path)}`
});
setModuleEnv('commonjs');
await copy(esEntryFile, libEntryFile);
await compileJs(libEntryFile);
stepper.success('Build Package Entry');
} catch (err) {
stepper.error('Build Package Entry', err);
}
}
export async function build() { export async function build() {
setNodeEnv('production'); setNodeEnv('production');
await clean(); await clean();
await buildESModuleOutputs(); await buildESModuleOutputs();
await buildCommonjsOutputs(); await buildCommonjsOutputs();
await buildStyleEntry(); await buildStyleEntry();
await buildPackageEntry();
await buildPackedOutputs(); await buildPackedOutputs();
} }

View File

@ -1,12 +1,24 @@
import { join } from 'path'; import { join } from 'path';
import { pascalize, getComponents, smartOutputFile } from '../common'; import { pascalize, getComponents, smartOutputFile } from '../common';
import { SRC_DIR, PACKAGE_JSON, PACKAGE_ENTRY_FILE } from '../common/constant'; import { SRC_DIR, PACKAGE_JSON } from '../common/constant';
const version = process.env.PACKAGE_VERSION || PACKAGE_JSON.version; const version = process.env.PACKAGE_VERSION || PACKAGE_JSON.version;
function genImports(components: string[]): string { type Options = {
outputPath: string;
pathResolver?: Function
};
function genImports(components: string[], options: Options): string {
return components return components
.map(name => `import ${pascalize(name)} from '${join(SRC_DIR, name)}';`) .map(name => {
let path = join(SRC_DIR, name);
if (options.pathResolver) {
path = options.pathResolver(path);
}
return `import ${pascalize(name)} from '${path}';`;
})
.join('\n'); .join('\n');
} }
@ -14,11 +26,11 @@ function genExports(names: string[]): string {
return names.map(name => `${name}`).join(',\n '); return names.map(name => `${name}`).join(',\n ');
} }
export function genPackageEntry() { export function genPackageEntry(options: Options) {
const components = getComponents(); const components = getComponents();
const names = components.map(item => pascalize(item)); const names = components.map(item => pascalize(item));
const content = `${genImports(components)} const content = `${genImports(components, options)}
const version = '${version}'; const version = '${version}';
const components = [ const components = [
@ -33,7 +45,7 @@ function install(Vue) {
Vue.component(item.name, item); Vue.component(item.name, item);
} }
}); });
}; }
if (typeof window !== 'undefined' && window.Vue) { if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue); install(window.Vue);
@ -51,5 +63,5 @@ export default {
}; };
`; `;
smartOutputFile(PACKAGE_ENTRY_FILE, content); smartOutputFile(options.outputPath, content);
} }

View File

@ -4,6 +4,7 @@ import { genPacakgeStyle } from './gen-package-style';
import { genSiteMobileShared } from './gen-site-mobile-shared'; import { genSiteMobileShared } from './gen-site-mobile-shared';
import { genSiteDesktopShared } from './gen-site-desktop-shared'; import { genSiteDesktopShared } from './gen-site-desktop-shared';
import { genStyleDepsMap } from './gen-style-deps-map'; import { genStyleDepsMap } from './gen-style-deps-map';
import { PACKAGE_ENTRY_FILE } from '../common/constant';
const PLUGIN_NAME = 'VantCliSitePlugin'; const PLUGIN_NAME = 'VantCliSitePlugin';
@ -16,7 +17,9 @@ export class VantCliSitePlugin {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
genStyleDepsMap() genStyleDepsMap()
.then(() => { .then(() => {
genPackageEntry(); genPackageEntry({
outputPath: PACKAGE_ENTRY_FILE
});
genPacakgeStyle(); genPacakgeStyle();
genSiteMobileShared(); genSiteMobileShared();
genSiteDesktopShared(); genSiteDesktopShared();

View File

@ -1,10 +1,13 @@
module.exports = function(api: any) { module.exports = function(api: any) {
const { BABEL_MODULE, NODE_ENV } = process.env; const { BABEL_MODULE, NODE_ENV } = process.env;
const isTest = NODE_ENV === 'test'; const isTest = NODE_ENV === 'test';
const useESModules = BABEL_MODULE !== 'commonjs' && !isTest; const useESModules = BABEL_MODULE !== 'commonjs' && !isTest;
api && api.cache(false); console.log('cache ??', useESModules, api);
if (api) {
console.log('never ed');
api.cache.never();
}
return { return {
presets: [ presets: [

View File

@ -1,7 +1,8 @@
import merge from 'webpack-merge'; import merge from 'webpack-merge';
import { join } from 'path';
import { baseConfig } from './webpack.base'; import { baseConfig } from './webpack.base';
import { getVantConfig, getWebpackConfig, setBuildTarget } from '../common'; import { getVantConfig, getWebpackConfig, setBuildTarget } from '../common';
import { LIB_DIR, PACKAGE_ENTRY_FILE } from '../common/constant'; import { LIB_DIR, ES_DIR } from '../common/constant';
export function packageConfig(isMinify: boolean) { export function packageConfig(isMinify: boolean) {
const { name } = getVantConfig(); const { name } = getVantConfig();
@ -13,7 +14,7 @@ export function packageConfig(isMinify: boolean) {
{ {
mode: 'production', mode: 'production',
entry: { entry: {
[name]: PACKAGE_ENTRY_FILE [name]: join(ES_DIR, 'index.js')
}, },
stats: 'none', stats: 'none',
output: { output: {