PWA Blog Add-On  дозволяє вам користуватися блогом на PWA.

У цій статті ви дізнаєтеся, як встановити PWA Blog на PWA Studio.

Бажаєте, щоб ми встановили та налаштували для вас модуль PWA Blog Add-On?

Наші девелопери зроблять це замість ваc – перегляньте наш Інсталяційний сервіс.

Примітка: ваш код може дещо відрізнятися від наведених прикладів через різні версії PWA Studio.

Виконайте наведені нижче дії, щоб встановити PWA Blog Add-On Magento 2:

1. Переконайтеся, що ви встановили останню версію модуля Блогу Magefan (Базовий, Плюс або Екстра) і Magefan Blog GraphQL Extension.

2. Завантажте папку src з архіву в кореневий каталог PWA Studio root directory.

3. Перейдіть до кореневого каталогу PWA Studio.

4. Додайте маршрут до блогу (blog static route).

  •  Оновіть local-intercept.js. Замініть цей рядок:
function localIntercept() {}

на

function localIntercept(targets) {
    targets.of("@magento/venia-ui").routes.tap(routes => {
        routes.push({
            name: "Blog",
            pattern: "/blog",
            path: require.resolve("./src/lib/magefan/pwa-studio-blog-ui/src/components/Routes")
        });
        return routes;
    });
}

Приклад файлу (samples/local-intercept.js).

5. Створіть component directories.

mkdir -p src/components
mkdir -p src/components/App
mkdir -p src/components/Main
mkdir -p src/components/Adapter

6. Скопіюйте наступні компоненти – components.

cp node_modules/@magento/venia-ui/lib/components/App/app.js src/components/App
cp node_modules/@magento/venia-ui/lib/components/App/container.js src/components/App
cp node_modules/@magento/venia-ui/lib/components/Main/main.js src/components/Main
cp node_modules/@magento/venia-ui/lib/components/Adapter/adapter.js src/components/Adapter

7. Додайте blog core styles.

  • Оновіть components/Main/main.js. Додайте цей рядок у кінці імпорту:
import blogPageClasses from './../../lib/magefan/pwa-studio-blog-ui/src/index.module.css';

і замініть цей рядок

<div className={pageClass}>{children}</div>

на

<div className={`${pageClass} ${blogPageClasses.blogPage}`}>{children}</div>

Приклад файлу (samples/components/Main/main.js).

8. Оновіть import statements.

  • Оновіть відносний імпорт (relative imports) у components/Main/main.js.
import { mergeClasses } from '@magento/venia-ui/lib/classify';
import Footer from '@magento/venia-ui/lib/components/Footer';
import Header from '@magento/venia-ui/lib/components/Header';
import defaultClasses from '@magento/venia-ui/lib/components/Main/main.css';

Приклад файлу (samples/components/Main/main.js).

  • Оновіть відносний імпорт у components/App/app.js.
import globalCSS from '@magento/venia-ui/lib/index.css';
import { HeadProvider, Title } from '@magento/venia-ui/lib/components/Head';
import Main from '../Main';
import Mask from '@magento/venia-ui/lib/components/Mask';
import Navigation from '@magento/venia-ui/lib/components/Navigation';
import Routes from '@magento/venia-ui/lib/components/Routes';
import ToastContainer from '@magento/venia-ui/lib/components/ToastContainer';
import Icon from '@magento/venia-ui/lib/components/Icon';

Приклад файлу (samples/components/App/app.js).

  • Оновіть відносний імпорт у components/App/container.js.
import { useErrorBoundary } from '@magento/venia-ui/lib/components/App/useErrorBoundary';

Приклад файлу (samples/components/App/container.js).

  • Оновіть відносний імпорт у components/Adapter/adapter.js.
import { AppContextProvider } from '@magento/venia-ui/lib/components/App';
import App from '../App';

Приклад файлу (samples/components/Adapter/adapter.js).

  • Відкрийте файл src/index.js вашого проекту та оновіть імпорт для компонента Adapter, щоб використовувати свій кастомний компонент Adapter.
import Adapter from './components/Adapter';

Приклад файлу (samples/src/index.js).

9. Експортуйте компоненти

  • Створіть файл src/components/App/index.js з наступним вмістом
export { default } from './container'
  • Створіть файл src/components/Main/index.js з наступним вмістом
export { default } from './main'
  • Створіть файл src/components/Adapter/index.js з наступним вмістом
export { default } from './adapter'

10. Перепишіть/розширте Main component.

    • У кореневому каталозі PWA Studio створіть overwrite плагіна webpack moduleOverrideWebpackPlugin.js з таким кодом:
const path = require('path');
const glob = require('glob');

module.exports = class NormalModuleOverridePlugin {
    constructor(moduleOverrideMap) {
        this.name = 'NormalModuleOverridePlugin';
        this.moduleOverrideMap = moduleOverrideMap;
    }

    requireResolveIfCan(id, options = undefined) {
        try {
            return require.resolve(id, options);
        } catch (e) {
            return undefined;
        }
    }
    resolveModulePath(context, request) {
        const filePathWithoutExtension = path.resolve(context, request);
        const files = glob.sync(`${filePathWithoutExtension}@(|.*)`);
        if (files.length === 0) {
            throw new Error(`There is no file '${filePathWithoutExtension}'`);
        }
        if (files.length > 1) {
            throw new Error(
                `There is more than one file '${filePathWithoutExtension}'`
            );
        }

        return require.resolve(files[0]);
    }

    resolveModuleOverrideMap(context, map) {
        return Object.keys(map).reduce(
            (result, x) => ({
                ...result,
                [require.resolve(x)]:
                this.requireResolveIfCan(map[x]) ||
                this.resolveModulePath(context, map[x]),
            }),
            {}
        );
    }

    apply(compiler) {
        if (Object.keys(this.moduleOverrideMap).length === 0) {
            return;
        }

        const moduleMap = this.resolveModuleOverrideMap(
            compiler.context,
            this.moduleOverrideMap
        );

        compiler.hooks.normalModuleFactory.tap(this.name, (nmf) => {
            nmf.hooks.beforeResolve.tap(this.name, (resolve) => {
                if (!resolve) {
                    return;
                }

                const moduleToReplace = this.requireResolveIfCan(resolve.request, {
                    paths: [resolve.context],
                });
                if (moduleToReplace && moduleMap[moduleToReplace]) {
                    resolve.request = moduleMap[moduleToReplace];
                }

                return resolve;
            });
        });
    }
};
    • У кореневому каталозі PWA Studio створіть файл overwrite mapping componentOverrideMapping.js з таким кодом:
module.exports = componentOverride = {
    [`@magento/venia-ui/lib/components/Main`]: 'src/components/Main',
};

11. Підіть у папку src/lib/magefan-blog-ui та виконайте наступну CLI команду:

npm install

12. Перейдіть до кореневого каталогу PWA Studio, потім створіть production build та запустіть сервер.

npm run build
npm start

Після встановлення блогу PWA ви можете перевірити , щоб почати налаштування свого блогу.