Skip to main content

Image and video urls have local and production urls

1. Define Asset Paths

  • Create an assets folder: This will hold your images and videos.

  • Create an environments folder: This will hold environment-specific configurations.

  • Create environment.ts and environment.prod.ts files:

    // environment.ts
    export const environment = {
    production: false,
    imageUrlPrefix: '', // Empty for local development
    videoUrlPrefix: '',
    };

    // environment.prod.ts
    export const environment = {
    production: true,
    imageUrlPrefix: 'https://cdn.example.com/images/',
    videoUrlPrefix: 'https://cdn.example.com/videos/',
    };

3. Import and Use Environment Variables

  • In app.module.ts:

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { AppComponent } from './app.component';

    import { environment } from '../environments/environment';

    @NgModule({
    declarations: [ AppComponent ],
    imports: [ BrowserModule ],
    providers: [],
    bootstrap: [ AppComponent ]
    })
    export class AppModule { }
  • In your components (e.g., app.component.ts):

    import { Component } from '@angular/core';
    import { environment } from '../environments/environment';

    @Component({
    selector: 'app-root',
    template: `
    <img [src]="getLocalImageUrl()" [srcset]="getCdnImageUrl()" />
    <video [src]="getLocalVideoUrl()" [srcset]="getCdnVideoUrl()" controls></video>
    `
    })
    export class AppComponent {
    imageUrl = 'my-image.jpg';
    videoUrl = 'my-video.mp4';

    getLocalImageUrl() {
    return environment.production ? '' : this.imageUrl;
    }

    getCdnImageUrl() {
    return environment.production ? `\\\${environment.imageUrlPrefix}\\${this.imageUrl}` : '';
    }

    getLocalVideoUrl() {
    return environment.production ? '' : this.videoUrl;
    }

    getCdnVideoUrl() {
    return environment.production ? `\\\${environment.videoUrlPrefix}\\${this.videoUrl}` : '';
    }
    }

4. Angular CLI Configurations

  • angular.json:
    • Build Configurations:
      • development:
        • Set assets to include your local assets folder.
      • production:
        • Set assets to include your local assets folder (or if you want to copy assets to the dist folder, adjust accordingly).

5. Production Build

  • Run ng build --prod: This will use the environment.prod.ts file and generate a production build with CDN URLs.

Explanation

  • Conditional Logic: The component uses conditional logic based on the environment.production flag to determine which URL to use for each attribute.
  • src and srcset:
    • In development, the src attribute uses the local URL. The srcset attribute is empty.
    • In production, the src attribute is empty, and the srcset attribute uses the CDN URL.
  • Browser Behavior:
    • Browsers prioritize the srcset attribute if it's available. This ensures that the browser loads the image or video from the CDN in production.

Key Considerations

  • Browser Support: The srcset attribute has excellent browser support.
  • Image Optimization: Optimize your images for different screen sizes and resolutions to maximize the benefits of srcset.
  • CDN Performance: Choose a reliable CDN with good performance and global coverage.

You can add a folder to the root of your Angular project, but there are some considerations depending on how your app is built and served. Here are various approaches to handling static assets without adding extra complexity:

1. Placing a Folder at the Root (public or static)

  • How it works: You add a folder (e.g., public or static-media) directly at the project root (/static-media/image.jpg).
  • Pros:
    • No need for Express or another server.
    • Easy to manage local assets for development.
  • Cons:
    • Angular’s CLI (ng serve) does not automatically expose this folder.
    • If using Angular’s built-in development server, it won't recognize this folder unless manually configured.
    • If hosted on a service like Firebase Hosting or Vercel, you'll need to configure rewrites.

Solution: If hosting on a static file server (e.g., Nginx), you can directly serve /static-media by configuring the server settings.

2. Using src/assets, But Excluding Specific Folders

  • How it works: Place media files in src/assets/static-media, then exclude them from the build process.
  • Pros:
    • Angular recognizes src/assets automatically, so no extra setup needed.
    • Convenient during development.
  • Cons:
    • You must explicitly configure exclusions so files aren’t bundled in production.

Solution: Modify angular.json to exclude specific folders:

{
"assets": [
"src/assets",
{
"glob": "**/*",
"input": "src/assets/static-media",
"ignore": ["**/*.jpg", "**/*.png", "**/*.gif", "**/*.mp4"]
}
]
}

3. Using Environment-Specific URLs

  • How it works: Instead of referencing local files, use environment variables to point to CDN-hosted assets.
  • Pros:
    • Completely eliminates local asset bundling issues.
    • Optimized for production.
  • Cons:
    • Requires maintaining correct asset URLs across environments.

Solution: Define a base URL in src/environments/environment.ts:

export const environment = {
production: true,
mediaBaseUrl: 'https://cdn.example.com/assets/'
};

Then, reference it dynamically:

<img [src]="environment.mediaBaseUrl + 'image.jpg'" alt="CDN Image" />

4. Configuring a Custom Web Server Rewrite Rule (If Applicable)

  • If your app is deployed on Apache, Nginx, or Firebase Hosting, you can configure a static folder at the root and serve media directly.
  • Example for Nginx:
    location /static-media {
    root /var/www/my-angular-app;
    }

Why Not Just Add a Folder?

  • If using ng serve, the Angular dev server won’t automatically recognize a root-level folder unless explicitly configured.
  • In production, it depends on how you deploy—if using a traditional static file server, it works fine, but cloud hosting (Firebase, Vercel, Netlify) requires additional setup to expose the folder.
  • Security concerns: Some platforms might restrict serving files directly from the app’s root to prevent exposure of sensitive data.

If simplicity is your goal, the root folder approach works best when deploying on a traditional server. But if you're using Angular’s built-in tools or a cloud host, tweaking angular.json or using environment URLs would be smoother.

Let me know which approach fits best into your setup!