UNPKG

@dscodotco/theme-cli

Version:

A CLI tool for developing Shopify themes

308 lines (237 loc) 8.14 kB
# Theme Analysis Tutorial This tutorial shows you how to analyze your Shopify theme's structure, dependencies, and performance using Theme CLI. ## Getting Started First, let's set up our theme analysis tools: ```typescript import { ThemeAPI } from '@dscodotco/theme-cli'; import { Shopify } from 'shopify-api-node'; import { ThemeManager } from './theme-manager'; // Initialize ThemeAPI const shopify = new Shopify({ shopName: process.env.SHOPIFY_STORE_NAME, accessToken: process.env.SHOPIFY_ACCESS_TOKEN }); const themeManager = new ThemeManager({ credentials: { storeName: process.env.SHOPIFY_STORE_NAME, apiKey: process.env.SHOPIFY_API_KEY, password: process.env.SHOPIFY_API_PASSWORD }, themeId: parseInt(process.env.SHOPIFY_THEME_ID) }); const themeAPI = new ThemeAPI(shopify, themeManager, './my-theme'); ``` ## Analyzing Theme Structure ### 1. Get Theme Metadata Let's start by examining the theme's overall structure: ```typescript async function analyzeThemeStructure() { const metadata = await themeAPI.getMetadata(); console.log('Theme Structure:'); console.log('----------------'); console.log(`Sections: ${metadata.sections.length}`); console.log(`Templates: ${Object.keys(metadata.templates).length}`); console.log(`Assets: ${metadata.assets.length}`); // Analyze template types const templateTypes = new Set( Object.values(metadata.templates).map(t => t.type) ); console.log('\nTemplate Types:', Array.from(templateTypes)); } ``` ### 2. Analyze Page Types Examine the different types of pages in your theme: ```typescript async function analyzePageTypes() { const pages = await themeAPI.getPages(); // Group pages by type const pagesByType = pages.reduce((acc, page) => { acc[page.type] = acc[page.type] || []; acc[page.type].push(page.path); return acc; }, {}); console.log('Page Types:'); console.log('-----------'); for (const [type, paths] of Object.entries(pagesByType)) { console.log(`${type}: ${paths.length} pages`); console.log('Examples:', paths.slice(0, 3)); } } ``` ## Dependency Analysis ### 1. Build Dependency Graph Create a visual representation of theme dependencies: ```typescript async function buildDependencyGraph() { const graph = await themeAPI.buildDependencyGraph(); console.log('Template Dependencies:'); console.log('--------------------'); for (const [template, deps] of Object.entries(graph)) { console.log(`\n${template}:`); console.log(' Sections:', deps.sections); console.log(' Snippets:', deps.snippets); console.log(' Assets:', deps.assets); } } ``` ### 2. Find Unused Components Identify unused sections and snippets: ```typescript async function findUnusedComponents() { const unused = await themeAPI.findUnusedSections(); console.log('Unused Components:'); console.log('-----------------'); console.log('Sections:', unused.sections); console.log('Snippets:', unused.snippets); // Suggest cleanup if (unused.sections.length > 0 || unused.snippets.length > 0) { console.log('\nCleanup Suggestions:'); console.log('1. Review unused components for potential reuse'); console.log('2. Remove confirmed unused components'); console.log('3. Update theme documentation'); } } ``` ## Performance Analysis ### 1. Analyze Asset Usage Track how assets are used across templates: ```typescript async function analyzeAssetUsage() { const metadata = await themeAPI.getMetadata(); const assetUsage = {}; // Track asset usage across templates for (const [template, data] of Object.entries(metadata.templates)) { for (const asset of data.assets || []) { assetUsage[asset] = assetUsage[asset] || []; assetUsage[asset].push(template); } } console.log('Asset Usage:'); console.log('------------'); for (const [asset, templates] of Object.entries(assetUsage)) { console.log(`${asset}: Used in ${templates.length} templates`); console.log(' Templates:', templates); } } ``` ### 2. Check Template Complexity Analyze template complexity and suggest optimizations: ```typescript async function analyzeTemplateComplexity() { const templates = await themeAPI.getTemplates(); for (const template of templates) { const analysis = await themeAPI.analyzeTemplate(template, { includeSections: true, includeSnippets: true, includeAssets: true }); console.log(`\nTemplate: ${template}`); console.log('----------------'); console.log(`Sections: ${analysis.sections.length}`); console.log(`Snippets: ${analysis.snippets.length}`); console.log(`Assets: ${analysis.assets.length}`); // Check for potential issues if (analysis.sections.length > 10) { console.log('Warning: High number of sections may impact performance'); } if (analysis.snippets.length > 15) { console.log('Warning: Consider consolidating snippets'); } } } ``` ## Generating Reports ### 1. Theme Health Report Create a comprehensive theme health report: ```typescript async function generateHealthReport() { const report = await themeAPI.generateThemeReport(); console.log('Theme Health Report'); console.log('=================='); // Structure console.log('\nStructure:'); console.log(`Total Templates: ${report.templateCount}`); console.log(`Total Sections: ${report.sectionCount}`); console.log(`Total Snippets: ${report.snippetCount}`); // Performance console.log('\nPerformance Metrics:'); console.log(`Average Template Size: ${report.averageTemplateSize}KB`); console.log(`Total Asset Size: ${report.totalAssetSize}MB`); // Issues if (report.issues.length > 0) { console.log('\nPotential Issues:'); report.issues.forEach(issue => { console.log(`- ${issue.description} (${issue.severity})`); }); } } ``` ### 2. Dependency Report Generate a detailed dependency report: ```typescript async function generateDependencyReport() { const graph = await themeAPI.buildDependencyGraph(); // Find circular dependencies const circular = findCircularDependencies(graph); // Find shared dependencies const shared = findSharedDependencies(graph); console.log('Dependency Report'); console.log('================'); if (circular.length > 0) { console.log('\nCircular Dependencies:'); circular.forEach(cycle => { console.log(`- ${cycle.join(' -> ')}`); }); } console.log('\nMost Shared Components:'); Object.entries(shared) .sort((a, b) => b[1].length - a[1].length) .slice(0, 5) .forEach(([component, templates]) => { console.log(`${component}: Used in ${templates.length} templates`); }); } ``` ## Best Practices ### 1. Regular Analysis Schedule regular theme analysis: ```typescript async function scheduleAnalysis() { // Run daily analysis const schedule = require('node-schedule'); schedule.scheduleJob('0 0 * * *', async () => { console.log('Running daily theme analysis...'); await analyzeThemeStructure(); await findUnusedComponents(); await analyzeTemplateComplexity(); // Generate reports await generateHealthReport(); await generateDependencyReport(); }); } ``` ### 2. Monitoring Changes Track changes over time: ```typescript async function monitorThemeChanges() { // Watch for file changes themeAPI.watchTheme(async (event, path) => { console.log(`File changed: ${path}`); // Analyze impact const impact = await analyzeChangeImpact(path); if (impact.affectedTemplates.length > 0) { console.log('Affected templates:', impact.affectedTemplates); console.log('Suggestion:', impact.suggestion); } }); } ``` ## Next Steps 1. Set up automated analysis in your CI/CD pipeline 2. Create custom reports for your specific needs 3. Implement monitoring for key metrics 4. Schedule regular theme audits For more information, check out: - [API Reference](../api/README.md) - [Best Practices](../development/best-practices.md) - [Performance Guide](../development/performance.md)