【发布时间】:2017-06-13 13:37:54
【问题描述】:
我有一个现有的、非常大的 Angular 1.x 应用程序,它运行今天的 ES5 代码。 几乎所有的应用程序都在同一个模块上运行。我的主模块在文件“dashboardApp.js”中定义。
我想开始使用 ES6,每个组件都有模块,因为应用程序是组件结构的。为了让它在开发中运行,我想开始使用 Webpack。
我尝试添加 Webpack,所以我添加了所有需要的 npm 依赖项并添加了以下 webpack.config.js
var webpack = require('webpack');
module.exports = {
entry: '../app/dashboardApp.js',
output:{
path: __dirname + '/../dst/dist',
filename: 'my.bundle.js'
},
module:{
rules: [{
test: /\.js$/,
loader: 'babel-loader',
exclude: /(node_modules|bower_components)/
}]
}
};
另外,我在 package.json 中添加了以下属性:
"scripts": {
"build": "webpack --config webpack.config.js"
},
并且能够成功运行构建并创建 my.bundle.js。但是,当尝试仅使用 my.bundle.js 脚本加载应用程序时,出现异常:
Uncaught Error: [$injector:modulerr] Failed to instantiate module dashboardApp due to:
Error: [$injector:unpr] Unknown provider: myConsts
myConsts 是一个角度常数,在使用 Webpack 之前通过加载脚本包含在内,因此我的问题是:
需要什么才能将一个现有的 Angular 1.x 应用程序转换为一个 Webpack 生成的脚本应用程序,该应用程序用于显式加载所有脚本。为了包含在生成的文件中,我需要在所有文件中进行哪些更改,这些更改都定义在同一个模块上。我知道 webpack 是一个模块捆绑器,但我不了解我需要做什么才能使旧应用程序与 Webpack 一起工作。我是否需要将所有文件转换为 ES6 模块导入/导出语法?当旧的角度语法(1个控制器/服务/常量......每个文件都在同一个模块上)时,Webpack如何知道要加载哪些文件?给定入口点它做了什么。
谢谢
【问题讨论】:
-
是否需要将所有文件转换为 ES6 模块导入/导出语法? - 不一定是导入/导出,可以是带有
require的 CJS 模块,但是可以. 当旧的 Angular 语法时,Webpack 如何知道要加载哪些文件 - 它不知道。这是你的责任。 -
这意味着根文件应该包含应用程序运行所需的所有模块,这意味着不是根文件的所有其他文件都必须位于与根文件不同的模块中,并且根文件应该包含它(不一定直接,而是分层)?
-
你是指Angular模块还是'modules'的JS模块?
-
Angular 模块
-
当每个文件(JS 模块)有 1 个 Angular 模块时效果最好。参见例如 stackoverflow.com/a/43858286/3731501 。否则,您需要先定义 Angular 模块,然后才能导入与
angular.module('app')一起使用它的文件。这破坏了模块封装。