Webpack 2 и Angular 1: экспорт и импорт модулей
надеюсь получить некоторые разъяснения о том, почему следующее не работает, как ожидалось, надеюсь, это что-то простое я пропустил. Без Webpack текущая реализация работает так, как ожидалось.
В идеале, хотел бы сохранить текущую реализацию, я чувствую, что регистрация компонента / контроллера / etc должна выполняться в собственном файле и просто указывать на относительный модуль. Но если это не лучшая практика, я также хотел бы увидеть другое предложение.
корень.модуль, где я определяю корневой модуль, а затем в корне.файл компонента I прикрепляет компонент к этому модулю.текущая реализация, которая не импортирует модуль:
//root.component.js
'use strict';
var root = {
template: require('./root.html')
};
module.exports = angular
.module('root')
.component('root', root);
'use strict';
//root.module.js
module.exports = angular
.module('root', [
require('./common').name,
require('./components').name
]);
если я выполняю следующие работы и загружаю модуль, как ожидалось:
//root.component.js
'use strict';
var root = {
template: require('./root.html')
};
module.exports = root;
//root.module.js
'use strict';
module.exports = angular
.module('root', [
require('./common').name,
require('./components').name
])
.component('root', require('./root.component'));
текущее дерево каталогов:
├── ./src
│ ├── ./src/app
│ │ ├── ./src/app/app.less
│ │ ├── ./src/app/app.spec.js
│ │ ├── ./src/app/common
│ │ │ ├── ./src/app/common/app.component.js
│ │ │ ├── ./src/app/common/app.controller.js
│ │ │ ├── ./src/app/common/app.html
│ │ │ ├── ./src/app/common/footer
│ │ │ │ ├── ./src/app/common/footer/app-footer.component.js
│ │ │ │ ├── ./src/app/common/footer/app-footer.controller.js
│ │ │ │ ├── ./src/app/common/footer/app-footer.html
│ │ │ │ └── ./src/app/common/footer/index.js
│ │ │ ├── ./src/app/common/header
│ │ │ │ ├── ./src/app/common/header/app-nav.component.js
│ │ │ │ ├── ./src/app/common/header/app-nav.controller.js
│ │ │ │ ├── ./src/app/common/header/app-nav.html
│ │ │ │ └── ./src/app/common/header/index.js
│ │ │ ├── ./src/app/common/index.js
│ │ │ └── ./src/app/common/sideBar
│ │ │ ├── ./src/app/common/sideBar/app-sidebar.component.js
│ │ │ ├── ./src/app/common/sideBar/app-sidebar.controller.js
│ │ │ ├── ./src/app/common/sideBar/app-sidebar.html
│ │ │ └── ./src/app/common/sideBar/index.js
│ │ ├── ./src/app/components
│ │ │ ├── ./src/app/components/auth
│ │ │ │ ├── ./src/app/components/auth/auth-form
│ │ │ │ │ ├── ./src/app/components/auth/auth-form/auth-form.component.js
│ │ │ │ │ ├── ./src/app/components/auth/auth-form/auth-form.controller.js
│ │ │ │ │ ├── ./src/app/components/auth/auth-form/auth-form.html
│ │ │ │ │ └── ./src/app/components/auth/auth-form/index.js
│ │ │ │ ├── ./src/app/components/auth/auth.service.js
│ │ │ │ ├── ./src/app/components/auth/auth.user.js
│ │ │ │ ├── ./src/app/components/auth/index.js
│ │ │ │ ├── ./src/app/components/auth/login
│ │ │ │ │ ├── ./src/app/components/auth/login/index.js
│ │ │ │ │ ├── ./src/app/components/auth/login/login.component.js
│ │ │ │ │ ├── ./src/app/components/auth/login/login.controller.js
│ │ │ │ │ └── ./src/app/components/auth/login/login.html
│ │ │ │ └── ./src/app/components/auth/register
│ │ │ │ ├── ./src/app/components/auth/register/index.js
│ │ │ │ ├── ./src/app/components/auth/register/register.component.js
│ │ │ │ ├── ./src/app/components/auth/register/register.controller.js
│ │ │ │ └── ./src/app/components/auth/register/register.html
│ │ │ └── ./src/app/components/index.js
│ │ ├── ./src/app/root.component.js
│ │ ├── ./src/app/root.html
│ │ └── ./src/app/root.module.js
│ └── ./src/index.ejs
└── ./webpack.config.js
2 ответов
файл должен быть импортирован (или, точнее, require
d, потому что приложение полагается на модули CommonJS), чтобы оно было выполнено.
в первом фрагменте root.module.js
не содержит require('./root.component')
, так что root.component.js
никогда не выполняется.
он должен быть!--11-->
//root.module.js
module.exports = anglar
.module('root', [
require('./common').name,
require('./components').name
])
.component('root', require('./root.component'));
require('./root.component');
обратите внимание, что root.component.js
необходимо после root
модуль был определен, выполнение их в обратном порядке приведет к $injector:modulerr
ошибка.
доказанный путь к исключите условия гонки и используйте модульность иметь один угловой модуль в один файл. В этом случае не имеет значения, в каком порядке требуются файлы. Принято экспортировать и импортировать модуль name
свойство из файлов, содержащих угловые модули:
//root.component.js
module.exports = angular.module('root.rootComponent', [])
.component('root', {
template: require('./root.html')
})
.name;
//root.module.js
var rootComponentModule = require('./root.component');
var commonModule = require('./common');
var componentsModule = require('./components');
module.exports = angular
.module('root', [
rootComponentModule,
commonModule,
componentsModule
])
.name;
этот рецепт позволяет поддерживать хорошо аранжированную глубокую иерархию сильно модульных блоков. Это полезно для повторного использования и тестирования кода.
просто хочу поделиться своим подходом с вами. Я использую его уже довольно давно, и он отлично работает.
// src/components/foo/foo.component.js
import './foo.scss';
export class FooComponent {
static NAME = 'foo';
static OPTIONS = {
controller: FooComponent,
template : require('./foo.template.html'),
bindings : {},
};
constructor(FooService) {
'ngInject';
this._FooService = FooService;
}
$onInit() { /* ... */ }
$onDestroy() { /* ... */ }
/* ... */
}
// src/components/foo/foo.service.js
export class FooService {
/* ... */
}
// src/components/foo/index.js
import { FooComponent } from './foo.component';
import { FooService } from './foo.service';
export const FOO_COMPONENT = angular.module('components.foo', [])
.service('FooService', FooService)
.component(FooComponent.NAME, FooComponent.OPTIONS)
.name;
// src/components/index.js
export { FOO_COMPONENT } from './foo';
export { BAR_COMPONENT } from './bar';
/* ... */
// src/app/users/index.js
import { CORE } from 'shared/core';
import {
FOO_COMPONENT,
BAR_COMPONENT,
} from 'components';
import { USERS_LIST_COMPONENT } from './users-list';
import { USER_PROFILE_COMPONENT } from './user-profile';
/* ... */
export const USERS_MODULE = angular
.module('app.users', [
CORE,
FOO_COMPONENT,
BAR_COMPONENT,
USERS_LIST_COMPONENT,
USER_PROFILE_COMPONENT,
])
.name
// src/app/index.js
import { USERS_MODULE } from './users';
import { PRODUCTS_MODULE } from './users';
import { AppComponent } from './app.component';
export const APP_MODULE = angular
.module('app', [
USERS_MODULE,
PRODUCTS_MODULE,
])
.component(AppComponent.NAME, AppComponent.OPTIONS)
.name;