Movable Type naar Next.js Migratiegids voor Japanse Bedrijven

Als je enige tijd met Japanse enterprise-websites hebt gewerkt, ben je vrijwel zeker Movable Type tegengekomen. Het CMS van Six Apart heeft sinds het midden van de jaren 2000 een opmerkelijk sterke grip op de Japanse markt, voorzien van alles van bedrijfssites bij grote fabrikanten tot overheidsportals en universiteitswebsites. Maar hier is het ding -- het is 2026, en het web is verder gegaan. Je Movable Type-installatie waarschijnlijk niet.

Ik heb in de afgelopen twee jaar verschillende Japanse enterprise-sites van Movable Type af geholpen migreren, en ik zal eerlijk zijn: het is geen triviaal project. Er zijn eigenaardigheden rond tekencodering, content-structuren uniek voor Japanse bedrijfssites, en organisatorische overwegingen die deze migraties anders maken dan je typische WordPress-naar-Next.js-stap. Deze gids bestrijkt alles wat ik de moeilijke weg heb geleerd.

Movable Type naar Next.js Migratiegids voor Japanse Bedrijven

Inhoudsopgave

Waarom Japanse Bedrijven Movable Type Verlaten

Laten we het voor de hand liggende uit de weg ruimen: Movable Type is niet dood. Six Apart Japan onderhoudt het nog steeds, en Movable Type 8 (uitgebracht in laat 2024) voegde enkele moderne functies toe. Maar de handschriften zijn aan de muur voor verschillende redenen.

Prestatiebezorgdheden

Movable Type gebruikt een statisch publicatiemodel -- het herbouwt HTML-bestanden wanneer content verandert. Dit klinkt geweldig totdat je een site met 15.000 pagina's hebt en een content editor die 20 minuten wacht totdat een herbouwing klaar is. Ik heb Japanse bedrijfssites gezien waar editors herbouwingen 's nachts zouden inplannen omdat het proces zo langzaam was.

Next.js met ISR (Incremental Static Regeneration) of on-demand revalidatie lost dit volledig op. Pagina's worden individueel in milliseconden opnieuw gegenereerd.

Eigendomskosten

Movable Type-licenties in Japan kosten ruwweg ¥600.000-¥1.200.000 per jaar voor enterprise-licenties vanaf 2026. Dat is $4.000-$8.000 USD jaarlijks alleen voor de CMS-licentie, voordat hosting, plug-ins of aangepaste ontwikkeling in acht worden genomen. Vergelijk dat met een headless CMS zoals microCMS (populair in Japan, vanaf ¥4.900/maand voor businessplannen) gecombineerd met Next.js op Vercel, en de wiskunde ziet er heel anders uit.

Developer Tekort

Dit is het grote waar niemand publiekelijk over praat. Ontwikkelaars vinden die Perl kennen (Movable Type's taal) en bereid zijn aan MT-templates te werken wordt echt moeilijk in Japan. De mediaanleeftijd van MT-ervaren ontwikkelaars die ik ben tegengekomen is boven de 45. Intussen zijn Next.js-ontwikkelaars overal -- het is het framework dat Japanse tech-bedrijven in 2026 inhuren.

Beveiliging en Compliance

Movable Type heeft in de loop der jaren verschillende serieuze CVE's gehad, inclusief de beruchte XMLRPC-kwetsbaarheid (CVE-2021-20837) die actief werd misbruikt tegen Japanse sites. Met Japans gewijzigd APPI-vereisten (Wet op de Bescherming van Persoonsgegevens) die in 2025-2026 aanscherpen, evalueren bedrijven hun veiligheidssituatie opnieuw.

Inzicht in Movable Type's Architectuur

Voordat je kunt migreren, moet je begrijpen waar je van migreert. Het gegevensmodel van Movable Type verschilt van WordPress of de meeste moderne CMS'en.

Core Data Structures

MT Concept Beschrijving Next.js/Headless Equivalent
Blog Top-level content container Site of workspace
Entry Blogbericht of artikel Content item (blog type)
Page Statische pagina Content item (page type)
Category Hiërarchische taxonomie Category/tag system
Template HTML-templates met MT-tags React-componenten + layouts
Custom Field Uitgebreide entry-velden Content model velden
Asset Geüploade mediabestanden Media/asset library
Website Parent container voor blogs Multi-site configuratie

De sjabloontaal van Movable Type gebruikt tags zoals <mt:EntryTitle> en <mt:Entries>. Deze wijzen niet 1-op-1 toe aan iets in de moderne stack -- je bouwt de presentatielaag helemaal opnieuw.

The Database Layer

MT ondersteunt MySQL, PostgreSQL en SQLite. De meeste Japanse enterprise-installaties gebruiken MySQL. Het databaseschema is goed gedocumenteerd maar... eigenwijs. Aangepaste velden worden opgeslagen in een aparte mt_entry_meta-tabel met een sleutel-waarde-patroon, wat extractie niet-triviaal maakt.

Hier is hoe de entry-tabel eruit ziet:

SELECT 
  entry_id,
  entry_title,
  entry_text,
  entry_text_more,
  entry_excerpt,
  entry_created_on,
  entry_modified_on,
  entry_basename,
  entry_status
FROM mt_entry
WHERE entry_blog_id = 1
  AND entry_status = 2  -- 2 = published
ORDER BY entry_created_on DESC;

Merk de entry_text en entry_text_more split op. MT verdeelt body content in twee velden -- een patroon uit het vroege bloggen dat je moet samenvoegen tijdens migratie.

Movable Type naar Next.js Migratiegids voor Japanse Bedrijven - architectuur

Je Headless CMS Backend Kiezen

Next.js is je frontend-framework. Maar je hebt ergens een plek nodig om content te beheren. Voor Japanse bedrijven heb ik het beperkt tot vier realistische opties.

microCMS

Dit is de standaardkeuze voor Japanse bedrijven, en met reden. Het wordt gebouwd door een Japans bedrijf, heeft een native Japanse UI, Japanse klantondersteuning, en gegevensresidentie in Japan. De prijsstelling begint bij ¥4.900/maand (Hobby is gratis voor kleine projecten). De API is schoon, de webhook-ondersteuning werkt goed met Next.js ISR, en je content editors hoeven geen Engels.

Newt

Een ander door Japan gemaakte headless CMS dat aan kracht wint. Het is iets meer developer-vriendelijk dan microCMS en heeft betere flexibiliteit voor content-modellering. Goede optie als je site complexe content-structuren heeft.

Contentful

De globale enterprise-keuze. Sterke lokalisatieondersteuning, uitstekende API, en een volwassen ecosysteem. Het nadeel voor Japanse bedrijven: ondersteuning is in het Engels, de UI is in het Engels, en prijzen zijn in USD. Met $300/maand voor het Team-plan (2026-prijzen), is het aanzienlijk duurder dan Japanse alternatieven.

Sanity

Ik noem Sanity omdat het technisch uitstekend is en de aanpasbare Studio met Japanse labels kan worden geconfigureerd. Maar de leerkromme is steiler, en je zult niet veel Japanse ontwikkelaars met Sanity-ervaring vinden.

CMS Japanse UI Japan Data Residency Startprijs Best Voor
microCMS ¥4.900/ma De meeste Japanse bedrijfssites
Newt ¥3.300/ma Complexe content-modellen
Contentful ❌ (EU/US) ~$300/ma Globale ondernemingen
Sanity Gedeeltelijk $99/ma (Team) Developer-zware teams

Voor de meeste Japanse bedrijven die van Movable Type migreren, beveel ik microCMS of Newt aan. De frictiereductie van alles in het Japans hebben is meer waard dan je zou denken. We hebben uitgebreid met al deze gewerkt door onze headless CMS-ontwikkelingspraktijk.

Content Audit en Data Extractie

Dit is waar het echte werk begint. Sla de audit-fase niet over -- ik heb migraties zien mislukken omdat teams rechtstreeks naar extractie sprongen zonder te begrijpen wat ze eigenlijk hadden.

Stap 1: Inventariseer Alles

Maak verbinding met je MT-database en voer tellingen uit:

-- Count entries by blog
SELECT 
  b.blog_name,
  COUNT(e.entry_id) as entry_count
FROM mt_entry e
JOIN mt_blog b ON e.entry_blog_id = b.blog_id
WHERE e.entry_status = 2
GROUP BY b.blog_name;

-- Count custom fields per blog
SELECT 
  b.blog_name,
  em.entry_meta_type,
  COUNT(*) as field_count
FROM mt_entry_meta em
JOIN mt_entry e ON em.entry_meta_entry_id = e.entry_id
JOIN mt_blog b ON e.entry_blog_id = b.blog_id
GROUP BY b.blog_name, em.entry_meta_type;

Stap 2: Export Content

MT heeft een ingebouwde exportindeling, maar deze is beperkt. Ik geef de voorkeur aan rechtstreekse database-extractie met een Python-script:

import mysql.connector
import json
import html

def extract_mt_entries(config):
    conn = mysql.connector.connect(**config)
    cursor = conn.cursor(dictionary=True)
    
    cursor.execute("""
        SELECT 
            e.entry_id,
            e.entry_title,
            e.entry_text,
            e.entry_text_more,
            e.entry_excerpt,
            e.entry_basename,
            e.entry_created_on,
            e.entry_modified_on,
            GROUP_CONCAT(c.category_label) as categories
        FROM mt_entry e
        LEFT JOIN mt_placement p ON e.entry_id = p.placement_entry_id
        LEFT JOIN mt_category c ON p.placement_category_id = c.category_id
        WHERE e.entry_status = 2
        GROUP BY e.entry_id
    """)
    
    entries = cursor.fetchall()
    
    for entry in entries:
        # Combine text and text_more
        body = (entry['entry_text'] or '') + (entry['entry_text_more'] or '')
        entry['full_body'] = body
        # Handle encoding
        entry['entry_title'] = entry['entry_title']
    
    with open('mt_export.json', 'w', encoding='utf-8') as f:
        json.dump(entries, f, ensure_ascii=False, default=str, indent=2)
    
    return entries

Stap 3: Media Asset Migratie

MT slaat assets op het bestandssysteem op, meestal onder /path/to/mt/support/uploads/. Je moet:

  1. Alle bestanden inventariseren en ze afstemmen met databaserecords in mt_asset
  2. Opnieuw uploaden naar je nieuwe CMS of een CDN (Cloudinary, imgix, of de ingebouwde opslag van je CMS)
  3. Alle verwijzingen in je content body HTML bijwerken

Dit is vervelend. Budget tijd voor.

Omgang met Japanse Content Specifics

Dit gedeelte is waarom ik dit artikel heb geschreven. Generieke migratiegidsen dekken deze problemen niet.

Tekencodering

Oudere Movable Type-installaties (pre-MT5) slaagden soms content op in EUC-JP of Shift_JIS-codering, zelfs als de database nominaal UTF-8 was. Controleer je werkelijke gegevens:

# Detect encoding issues
import chardet

def check_encoding(text_bytes):
    result = chardet.detect(text_bytes)
    if result['encoding'] != 'utf-8':
        print(f"Warning: detected {result['encoding']} "
              f"with {result['confidence']:.0%} confidence")
    return result

Als je coderingsfouten vindt, converteer alles naar UTF-8 voordat je in je nieuwe CMS importeert. Onderbroken mojibake (文字化け) op een bedrijfssite is een carrière-limiterende gebeurtenis.

Ruby Text (Furigana)

Japanse bedrijfssites gebruiken frequent ruby-aantekeningen -- kleine leeshulpen boven kanjikarakters. MT-sjablonen behandelen deze vaak met aangepaste tags. In Next.js gebruik je standaard HTML <ruby>-elementen:

// components/RubyText.tsx
export function RubyText({ base, reading }: { base: string; reading: string }) {
  return (
    <ruby>
      {base}
      <rp>(</rp>
      <rt>{reading}</rt>
      <rp>)</rp>
    </ruby>
  );
}

Zorg ervoor dat je content-migratiescript bestaande ruby-markup behoudt.

Japanse Datumaanduiding

Japanse bedrijfssites geven data vaak weer in 和暦 (Japans era-formaat): 令和8年1月15日 in plaats van 2026-01-15. Handel dit af in je Next.js-componenten:

function formatJapaneseDate(dateString: string): string {
  const date = new Date(dateString);
  return date.toLocaleDateString('ja-JP-u-ca-japanese', {
    era: 'long',
    year: 'numeric',
    month: 'long',
    day: 'numeric',
  });
}

Verticale Tekstlay-outs

Sommige Japanse sites, vooral in uitgeverij of traditionele industrieën, gebruiken verticale tekst (縦書き). CSS handelt dit af:

.vertical-text {
  writing-mode: vertical-rl;
  text-orientation: mixed;
}

Next.js handelt dit prima af, maar test goed in alle browsers.

Het Next.js Frontend Bouwen

Met je content geëxtraheerd en je CMS gekozen, is het tijd om te bouwen. Hier is de architectuur die ik aanbeveel voor Japanse bedrijfssites.

App Router met Statische Generatie

Gebruik Next.js 15's App Router met statische generatie voor de meeste pagina's. Japanse bedrijfssites zijn typisch content-zwaar met onfrequente updates -- perfect voor statische generatie met on-demand revalidatie.

// app/news/[slug]/page.tsx
import { getArticle, getAllArticleSlugs } from '@/lib/cms';

export async function generateStaticParams() {
  const slugs = await getAllArticleSlugs();
  return slugs.map((slug) => ({ slug }));
}

export default async function NewsArticle({ 
  params 
}: { 
  params: Promise<{ slug: string }> 
}) {
  const { slug } = await params;
  const article = await getArticle(slug);
  
  return (
    <article>
      <h1>{article.title}</h1>
      <time dateTime={article.publishedAt}>
        {formatJapaneseDate(article.publishedAt)}
      </time>
      <div dangerouslySetInnerHTML={{ __html: article.body }} />
    </article>
  );
}

i18n Configuratie

Veel Japanse bedrijfssites hebben zowel Japanse als Engelse versies nodig. Next.js App Router handelt dit af met routegroepen of middleware-gebaseerde locale-detectie:

// middleware.ts
import { NextRequest, NextResponse } from 'next/server';

export function middleware(request: NextRequest) {
  const pathname = request.nextUrl.pathname;
  const locale = pathname.startsWith('/en') ? 'en' : 'ja';
  
  request.headers.set('x-locale', locale);
  return NextResponse.next();
}

We hebben tientallen tweetalige Japanse bedrijfssites gebouwd met Next.js -- ons Next.js-ontwikkelingsteam kan je door de nuances lopen.

SEO Migratiestraategie voor Japans Zoeken

Dit is niet onderhandelbaar. Japanse bedrijven leven en sterven door hun Google-zoekrankings (Yahoo! Japan gebruikt Google's engine, dus het gaat echt alleen om Google). Een verpeste migratie kan je organische verkeer maandenlang verwoesten.

URL Mapping

Movable Type genereert URL's met configureerbare patronen. Veelvoorkomende die ik op Japanse sites zie:

  • /blog/2024/01/entry-basename.html
  • /news/category/entry_basename.html
  • /archives/000123.html (het oudste patroon)

Maak volledige URL-mapping voordat je iets bouwt:

// scripts/generate-redirects.ts
interface RedirectMap {
  source: string;
  destination: string;
  permanent: boolean;
}

function generateRedirects(mtEntries: MTEntry[]): RedirectMap[] {
  return mtEntries.map(entry => ({
    source: buildMTUrl(entry),  // Old MT URL pattern
    destination: `/news/${entry.entry_basename}`,  // New Next.js URL
    permanent: true,  // 301 redirect
  }));
}

Zet deze in je next.config.ts:

const nextConfig = {
  async redirects() {
    const redirects = await import('./redirects.json');
    return redirects.default;
  },
};

Voor sites met duizenden redirects, gebruik in plaats daarvan middleware -- next.config.ts redirects hebben een praktische limiet.

Structured Data

Japanse Google-resultaten kenmerken zich zwaar met rijke snippets. Voeg JSON-LD toe voor artikelen, veelgestelde vragen, en organisatie-info:

function ArticleJsonLd({ article }: { article: Article }) {
  const jsonLd = {
    '@context': 'https://schema.org',
    '@type': 'Article',
    headline: article.title,
    datePublished: article.publishedAt,
    dateModified: article.updatedAt,
    author: {
      '@type': 'Organization',
      name: article.companyName,
    },
    inLanguage: 'ja',
  };

  return (
    <script
      type="application/ld+json"
      dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
    />
  );
}

Implementatie en Infrastructuur

Voor Japanse doelgroepen is latentie belangrijk. Hier is wat werkt:

Platform Japan Edge Nodes Best Voor Maandelijkse Kosten (typisch)
Vercel Tokio De meeste Next.js-sites $20-150/ma
AWS (CloudFront + Lambda@Edge) Tokio, Osaka Enterprise compliance $100-500/ma
Google Cloud Run + Cloud CDN Tokio GCP-native teams $50-200/ma
Cloudflare Pages Tokio + veel Eenvoudige statische sites Gratis-$25/ma

Vercel is mijn standaardaanbeveling. Het is speciaal gemaakt voor Next.js, heeft een edge node in Tokio, en de DX is ongeëvenaard. Voor bedrijven met strikte gegevensresidentievereisten (overheid, financieel), is AWS in ap-northeast-1 (Tokio) de veilige keuze.

Als je in plaats van Next.js Astro overweegt voor een content-zware site met minimale interactiviteit, dat is een geldige keuze ook -- controleer onze Astro-ontwikkelingsmogelijkheden.

Tijdlijn en Budgetplanning

Op basis van werkelijke migraties die ik heb voltooid, is dit wat je kunt verwachten:

Fase Duur Belangrijkste Activiteiten
Discovery & Audit 2-3 weken Content-inventaris, belanghebbendengesprekken, URL-mapping
CMS Setup & Content Modeling 2-4 weken Schema-ontwerp, content-migratiescripts
Content Migratie 3-6 weken Gegevensoverdracht, media-migratie, QA
Frontend Development 6-10 weken Next.js-build, componentbibliotheek, i18n
SEO & QA 2-3 weken Redirect-testen, prestatieafstelling, cross-browser QA
Gefaseerde Rollout 1-2 weken DNS-cutover, monitoring, hotfixes

Totaal: 16-28 weken voor een typische Japanse bedrijfssite met 1.000-10.000 pagina's.

Budget-wise, je kijkt naar ¥5.000.000-¥15.000.000 ($33.000-$100.000 USD) afhankelijk van complexiteit. Dat kan een heleboel lijken, maar overweeg: je betaalt waarschijnlijk al ¥1.000.000+ jaarlijks voor MT-licenties en gespecialiseerde ontwikkeling. De migratie betaalt zichzelf terug binnen 2-3 jaar door verminderde operationele kosten en verbeterde developer velocity.

Heb je een gedetailleerde schatting nodig voor jouw specifieke situatie? Neem contact op of bekijk onze prijzenpagina voor engagement-modellen.

Veelgestelde Vragen

Kunnen we Movable Type blijven gebruiken als een headless CMS met Next.js? Technisch ja -- Movable Type 7+ heeft een Data API die content naar een frontend kan serveren. Maar het is langzaam, slecht gedocumenteerd, en mist webhooks voor revalidatie. Ik heb deze benadering op één project geprobeerd en zou het niet aanraden. Je zult meer tijd besteden aan het omgaan met MT's API-beperkingen dan je zou doen migreren naar een goede headless CMS.

Hoe gaan we met het MT-herbouw-model tegen Next.js ISR om? Ze zijn fundamenteel anders. MT bouwt hele sitesecties tegelijk opnieuw (batch statische generatie). Next.js ISR genereert individuele pagina's on-demand opnieuw. Dit betekent dat je editors onmiddellijke publicatietijden krijgen in plaats van te wachten op herbouwingen. De gedachte-modelverandering is eigenlijk gemakkelijker voor editors -- ze drukken gewoon op publiceren en de pagina is binnen seconden live.

Wat gebeurt er met onze MT-plug-ins tijdens migratie? Elke MT-plug-in heeft een vervanger of herimplementatie nodig. Veelvoorkomende zoals contactformulieren (MT-gebaseerde formulierplug-ins) worden vervangen door Next.js-formulierverwerking of services zoals Formspree. Search-plug-ins worden vervangen door Algolia of de ingebouwde zoekopdracht van de CMS. Maak een complete plug-in-inventaris tijdens de audit-fase.

Zullen onze Google-rankings dalen tijdens migratie? Ze kunnen, maar dat hoeft niet. De kritieke factoren zijn: 301-omleidingen voor elke URL, onderhoud van identieke of verbeterde paginatitels en meta-beschrijvingen, behoud van interne linkstructuur, en indiening van een bijgewerkte sitemap. Ik heb migraties gezien waarbij de rankings eigenlijk verbeterden omdat de nieuwe site sneller was en betere Core Web Vitals scores had.

Hoe gaan we met Japanse-specifieke SEO-elementen om zoals Yahoo! Japan? Yahoo! Japan gebruikt sinds 2010 Google's zoekengine, dus je Google SEO-strategie dekt Yahoo! ook. De enige uitzondering zijn Yahoo! Japan's eigen eigenschappen (Yahoo! News, enz.) die aparte inzendingsprocessen hebben. Voor algemeen organisch zoeken, focus op Google en je bent gedekt.

Moeten we alle content migreren of dit als gelegenheid gebruiken om op te ruimen? Altijd opruimen. In elke Japanse bedrijfssite-migratie die ik heb gedaan, was 30-50% van de content verouderd, redundant, of had nul verkeer. Het migreren van dode content verspilt tijd en verzwakt je siteverificatie van topicale autoriteit. Gebruik analyticsgegevens om pagina's te identificeren die het waard zijn te migreren en laat de rest gaan (met geschikte 410 Gone-reacties, geen 404's).

Kunnen we Movable Type en Next.js parallel uitvoeren tijdens migratie? Ja, en ik beveel het aan. Gebruik een subdomein of pad-gebaseerde routing om de nieuwe Next.js-site voor gemigreerde secties uit te voeren terwijl MT de rest afhandelt. Dit laat je in fasen migreren in plaats van een riskante big-bang cutover. Reverse proxy-configuraties met nginx of Cloudflare Workers maken dit eenvoudig.

Wat zit Movable Type's ingebouwde toegangscontrole en ledenfeatures? Als je MT-site lid-login, gated content, of op rol gebaseerde toegang gebruikt, moet je authenticatie in Next.js implementeren. Auth.js (voorheen NextAuth.js) werkt goed hiervoor, of je kunt een service zoals Clerk of Auth0 gebruiken. Dit voegt complexiteit en kosten toe -- factor het van dag één in je planning in.