Ошибка ленивой загрузки Angular 5: не удается найти модуль

Я хотел бы использовать ленивую загрузку, но не могу понять, почему она не работает, возникает ошибка «Не удается найти модуль».
Это моя среда:
- Angular 5.2.1
- .NET Core 2
- Webpack 3.10.0
- angular-router-loader 0.8.2
- @ angular / cli 1.6.5
Я пробовал другой путь в loadChildren всегда безуспешно, я также временно отключил все охранники и дети бегут. Что я сделал не так?

ПАПКИ

ClientApp
  app
    components
      users
        users-routing.module.ts
        users.module.ts
  app-routing.module.ts
  app.module.shared.ts

app-routing.module.ts

const appRoutes: Routes = [
    {
        path: 'users',
        loadChildren: './components/users/users.module#UsersModule'/* ,
        canLoad: [AuthGuard] */
    },
    {
        path: '',
        redirectTo: '/login',
        pathMatch: 'full'
    },
    {
        path: '**',
        redirectTo: '/login'
    }
];

@NgModule({
    imports: [
        RouterModule.forRoot(
            appRoutes,
            { enableTracing: false }
        )
    ],
    exports: [
        RouterModule
    ],
    providers: [
        CanDeactivateGuard
    ]
})
export class AppRoutingModule { }

users-routing.module.ts

const usersRoutes: Routes = [
    {
        path: '',
        component: UsersComponent/* ,
        //canActivate: [AuthGuard],
        children: [
            {
                path: 'detail',
                canActivateChild: [AuthGuard],
                children: [
                    {
                        path: ':id',
                        component: UserViewComponent
                    },
                    {
                        path: 'edit/:id',
                        component: UserFormComponent,
                        canDeactivate: [CanDeactivateGuard],
                        resolve: {
                            user: UsersResolver
                          }
                    },
                    {
                        path: '',
                        component: UserFormComponent,
                        canDeactivate: [CanDeactivateGuard]
                    }
                ]
            },
            {
                path: '',
                component: UsersListComponent
            }
        ] */
    }
];

@NgModule({
    imports: [
        RouterModule.forChild(
            usersRoutes
        )
    ],
    exports: [
        RouterModule
    ]
})
export class UsersRoutingModule { }

users.module.ts

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        UsersRoutingModule,
        RouterModule
    ],
    declarations: [
        UsersComponent,
        UserFormComponent,
        UsersListComponent,
        UserViewComponent
    ],
    providers: [
        UsersResolver,
        RouterModule
    ]
})
export class UsersModule { }

webpack.config.js

const path = require('path');
const webpack = require('webpack');
const merge = require('webpack-merge');
const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin;
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;

module.exports = (env) => {
    // Configuration in common to both client-side and server-side bundles
    const isDevBuild = !(env && env.prod);
    const sharedConfig = {
        stats: {
            modules: false
        },
        context: __dirname,
        resolve: {
            extensions: ['.js', '.ts']
        },
        output: {
            filename: '[name].js',
            publicPath: 'dist/' // Webpack dev middleware, if enabled, handles requests for this URL prefix
        },
        module: {
            rules: [{
                    test: /\.ts$/,
                    include: /ClientApp/,
                    use: isDevBuild ? ['awesome-typescript-loader?silent=true', 'angular2-template-loader'] : '@ngtools/webpack'
                },
                {
                    test: /\.html$/,
                    use: 'html-loader?minimize=false'
                },
                {
                    test: /\.css$/,
                    use: ['to-string-loader', isDevBuild ? 'css-loader' : 'css-loader?minimize']
                },
                {
                    test: /\.(png|jpg|jpeg|gif|svg)$/,
                    use: 'url-loader?limit=25000'
                }
            ],
            loaders: [
                {
                  test: /\.ts$/,
                  loaders: [
                    'awesome-typescript-loader'
                  ]
                },
                {
                  test: /\.(ts|js)$/,
                  loaders: [
                    'angular-router-loader'
                  ]
                }
              ]
        },
        plugins: [new CheckerPlugin()]
    };

    // Configuration for client-side bundle suitable for running in browsers
    const clientBundleOutputDir = './wwwroot/dist';
    const clientBundleConfig = merge(sharedConfig, {
        entry: {
            'main-client': './ClientApp/boot.browser.ts'
        },
        output: {
            path: path.join(__dirname, clientBundleOutputDir)
        },
        plugins: [
            new webpack.DllReferencePlugin({
                context: __dirname,
                manifest: require('./wwwroot/dist/vendor-manifest.json')
            })
        ].concat(isDevBuild ? [
            // Plugins that apply in development builds only
            new webpack.SourceMapDevToolPlugin({
                filename: '[file].map', // Remove this line if you prefer inline source maps
                moduleFilenameTemplate: path.relative(clientBundleOutputDir, '[resourcePath]') // Point sourcemap entries to the original file locations on disk
            })
        ] : [
            // Plugins that apply in production builds only
            new webpack.optimize.UglifyJsPlugin(),
            new AngularCompilerPlugin({
                tsConfigPath: './tsconfig.json',
                entryModule: path.join(__dirname, 'ClientApp/app/app.module.browser#AppModule'),
                exclude: ['./**/*.server.ts']
            })
        ])
    });

    // Configuration for server-side (prerendering) bundle suitable for running in Node
    const serverBundleConfig = merge(sharedConfig, {
        resolve: {
            mainFields: ['main']
        },
        entry: {
            'main-server': './ClientApp/boot.server.ts'
        },
        plugins: [
            new webpack.DllReferencePlugin({
                context: __dirname,
                manifest: require('./ClientApp/dist/vendor-manifest.json'),
                sourceType: 'commonjs2',
                name: './vendor'
            })
        ].concat(isDevBuild ? [] : [
            // Plugins that apply in production builds only
            new AngularCompilerPlugin({
                tsConfigPath: './tsconfig.json',
                entryModule: path.join(__dirname, 'ClientApp/app/app.module.server#AppModule'),
                exclude: ['./**/*.browser.ts']
            })
        ]),
        output: {
            libraryTarget: 'commonjs',
            path: path.join(__dirname, './ClientApp/dist')
        },
        target: 'node',
        devtool: 'inline-source-map'
    });

    return [clientBundleConfig, serverBundleConfig];
};  

tsconfig.json

{
  "compilerOptions": {
    "module": "es2015",
    "moduleResolution": "node",
    "target": "es5",
    "sourceMap": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "skipDefaultLibCheck": true,
    "skipLibCheck": true, // Workaround for https://github.com/angular/angular/issues/17863. Remove this if you upgrade to a fixed version of Angular.
    "strict": true,
    "lib": [ "es6", "dom" ],
    "types": [ "webpack-env" ], 
    "typeRoots": [
      "node_modules/@types"
    ]
  },
  "exclude": [ "bin", "node_modules" ],
  "atom": { "rewriteTsconfig": false }
}

СООБЩЕНИЕ ОБ ОШИБКЕ

Отклонение необработанного обещания: не удается найти модуль ./ClientApp/app/components/users/users.module. ; Зона: угловая; Задача: Promise.then; Значение: Ошибка: не удается найти модуль ./ClientApp/app/components/users/users.module. при vendor.js у = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko?: 34015 в ZoneDelegate.invoke (vendor.js V = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko?: 117428) в Object.onInvoke (vendor.js V = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko:? 5604)? в ZoneDelegate.invoke (vendor.js v = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko: 117427) в Zone.run (vendor.js у = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko: 117178) при vendor.js у = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko?: 117898 в ZoneDelegate.invokeTask (vendor.js V = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko?: 117461) в Object.onInvokeTask ( ? vendor.js v = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko: 5595) в ZoneDelegate.invokeTask (vendor.js у = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko: 117460) в Zone.runTask (vendor.js у = AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko: 117228) Ошибка: не удается найти модуль»./ClientApp/ приложение / компоненты / пользователи / users.module '. на http://localhost:5000/dist/vendor.js?v=AdjSBPSITyauSY4VQBBoZmJ6NdWqor7MEuHgdi2Dgko:34015:9 ... [усечено]

ИЗМЕНИТЬ

ссылка на stackblitz для тестирования


person Luciano    schedule 25.01.2018    source источник
comment
app-routing.module.ts находится в app папке?   -  person Vivek Doshi    schedule 25.01.2018
comment
@VivekDoshi Да, это правильно   -  person Luciano    schedule 25.01.2018
comment
@Luciano Не редактируйте свой вопрос, указав, как вы его решили. Вместо этого ответьте на него ниже и примите его.   -  person Goodbye StackExchange    schedule 26.01.2018
comment
Если у вас есть ответ, опубликуйте его как ответ. Не редактируйте свой вопрос с этой целью.   -  person GrumpyCrouton    schedule 26.01.2018
comment
Хорошо, извините, ребята, и спасибо за редактирование   -  person Luciano    schedule 27.01.2018


Ответы (8)


Я нашел два решения (через OP путем редактирования):

  1. Ссылка на модуль после того, как он уже был разрешен с помощью оператора импорта:

    импортировать {UsersModule} из './components/users/users.module';

затем ссылаясь на этот способ:

{
    path: 'users',
    loadChildren: () => UsersModule,
    canLoad: [AuthGuard]
}
  1. Я добавил ng-router-loader в приложение (npm install ng-router-loader --save-dev) и настроил Webpack следующим образом:

         rules: [{
                 test: /\.ts$/,
                 include: /ClientApp/,
                 //use: isDevBuild ? ['awesome-typescript-loader?silent=true', 'angular2-template-loader'] : '@ngtools/webpack'
                 use: isDevBuild ? [{ loader: 'ng-router-loader' }, 'awesome-typescript-loader?silent=true', 'angular2-template-loader'] : '@ngtools/webpack'
             },
             {
                 test: /\.html$/,
                 use: 'html-loader?minimize=false'
             },
             {
                 test: /\.css$/,
                 use: ['to-string-loader', isDevBuild ? 'css-loader' : 'css-loader?minimize']
             },
             {
                 test: /\.(png|jpg|jpeg|gif|svg)$/,
                 use: 'url-loader?limit=25000'
             }
         ],
    

затем ссылка на модуль по пути:

    {
        path: 'users',
        loadChildren: './components/users/users.module#UsersModule',
        canLoad: [AuthGuard]
    }
person Community    schedule 26.01.2018
comment
@wctiger здесь тоже самое, интересно в чем была причина. Я работаю над своим проектом некоторое время, и однажды он просто перестал работать, но я уверен, что путь loadChildren правильный. Первый способ тоже спас мне день, но меня беспокоит, почему он работает. - person daisura99; 29.08.2018
comment
Но с первым способом я больше не могу включить AOT, поскольку AOT не поддерживает функцию стрелок в декораторах. - person Fang Liu; 08.03.2019
comment
У меня была такая же проблема в Angular 9. Добавление оператора import в мой файл routing.ts разрешило ее для меня, даже если для свойства loadChildren задан путь к модулю. - person Marcus Santodonato; 29.06.2020

Вы можете использовать это так:

const rootRoutes: Routes = [
  { path: 'your-path', loadChildren: () => UsersModule }
];
person Sinan Özata    schedule 13.07.2020

В настоящее время принятый ответ, который предлагает обменять значение loadChildren из строки на функцию, устраняет возможность компиляции AOT при выполнении производственной сборки.

У меня сработало: 1) использовать абсолютные пути 2) добавить ленивые загруженные модули в виде строкового массива в angular.json в разделе проекты> имя проекта> архитектор> сборка> параметры> lazyModules. Пути должны быть такими же, как определено в loadChildren.

Итак, в вашем случае, я думаю, это должно работать в вашем модуле маршрутизации:

loadChildren: 'app/components/users/users.module#UsersModule'

И в angular.json добавьте это в указанное выше место:

lazyModules: ["app/components/users/users.module"]
person Fredrik_Borgstrom    schedule 04.04.2019
comment
путь в lazyModules должен начинаться с src/. я только что тестировал. Я благодарен за ваш ответ, поскольку он позволил мне узнать об этом варианте в angular.json - person Harkal; 30.10.2020

Предположим, это AppModule, который обрабатывает отложенную загрузку, и функции вашей системы относятся к тому же дереву, что и она:

routes: Routes = [
    {
        path: 'files-pannel',
        loadChildren: () => import('./module-folder/module-name.module').then(m => m.ModuleName)
    }
];
person Char    schedule 20.03.2020

Имя его папки с опечатками - Users, а не users:

Изменять

'./components/users/users.module#UsersModule'

to

'./components/Users/users.module#UsersModule'
person Vivek Doshi    schedule 25.01.2018
comment
Имя папки - пользователь, я редактировал сообщение. Извините - person Luciano; 25.01.2018
comment
Не могли бы вы удалить RouterModule из users.module.ts и попробовать еще раз? @Luciano - person Vivek Doshi; 25.01.2018
comment
@ Люциано, не могли бы вы создать демо на stackblitz? - person Vivek Doshi; 25.01.2018
comment
Я добавил ссылку на stackblitz в посте - person Luciano; 25.01.2018
comment
@Luciano, проверьте эту stackblitz.com/edit/angular-route-issue, Сделайте так, чтобы он работал, нажмите на первую ссылку, вы получаете 2 ссылки из-за userRooutingModule, нет необходимости указывать путь и компонент, он автоматически укажет на userComponent. - person Vivek Doshi; 25.01.2018
comment
Хорошо, это изменение заставляет мой stackblitz работать, но то же изменение не помогает в моем приложении. Модуль всегда не может найти - person Luciano; 26.01.2018
comment
@ Luciano, Тогда я думаю, вам нужно найти проблему самостоятельно, я заставил stackblitz работать, дайте мне знать, если есть другой способ помочь :) - person Vivek Doshi; 26.01.2018
comment
Спасибо, Вивек Доши, я думаю, проблема в конфигурации веб-пакета, но я не знаю в чем именно. Я не знаю, как настроить всю среду на stackblitz - person Luciano; 26.01.2018

попробуйте сделать свой user.module.ts:

import {UserRoutes } from './User.routing'

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        UsersRoutingModule.forChild(UserRoutes), //<-- for child
        RouterModule
    ],
    declarations: [
        UsersComponent,
        UserFormComponent,
        UsersListComponent,
        UserViewComponent
    ],
    providers: [
        UsersResolver,
        RouterModule
    ]
})
export class UsersModule { }
person federico scamuzzi    schedule 25.01.2018
comment
Федерико, я не понимаю, как это реализовать, forChild не является методом UserRoutingModule (он внутри модуля) - person Luciano; 26.01.2018
comment
да, потому что вы экспортируете: [RouterModule] из вашей пользовательской маршрутизации .... Попробуйте !! - person federico scamuzzi; 26.01.2018

Обычно это ошибка пути. Измените путь.

Например, у меня работает такое решение:

loadChildren: '../changelog/changelog.module#ChangelogModule'

./folder or ../folder or folder

person Maxim Savin    schedule 26.11.2018

Я также столкнулся с той же проблемой при загрузке моего модуля. Я получал эту ошибку. Ошибка: не удается найти модуль app / users / users.module. Затем, выяснив, что это была ошибка, связанная с путем. Это решение работает для меня, надеюсь, оно поможет кому-нибудь. Добавьте в маршрут этот путь

{
   path: 'users',
   loadChildren: '../app/users/users.module#UsersModule'
 }

Выясните путь к папке вашего модуля, например, folder или ./folder или ../folder

Удачного кодирования !!

person Rashi Goyal    schedule 16.07.2020