- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
谁能帮我解决这个 1 对 2 的死胡同?
1) Angular 项目作为生产中的 AoT。这需要将我的源代码更改为具有 相对 component.ts 文件的 templateUrl 和 styleUrls。
2) Angular karma 作为单元测试的 JiT。这需要将我的源代码更改为具有 绝对 的 templateUrl 和 styleUrls,否则单元测试将抛出 404 寻找 .html 文件。
我想避免在源代码中维护相对路径和绝对路径。
我在这里有哪些选择?最佳做法是什么?
(我正在使用带有 aot 和 Karma 的 WEBPACK,而不是 angular-cli)
谢谢!!
更新:我们还将探索转换为 angular-cli,但这是一个巨大的项目,如果有人知道 angular-cli 用来实现这一目标的技巧,这对我们来说是一个障碍。甚至是解决方法,以便我们可以恢复单元测试!
我需要知道使用 AoT 或至少沿 AoT 运行单元测试的技巧(换句话说,使用一组 templateUrls 运行 aot 生产和 jit 单元测试)
再次感谢!
附言..这在没有 AoT 的情况下工作得很好(使用绝对 url),但是切换到 AoT(使用相对于组件文件的 url)已经阻止了我们。
更新 2:(包括我所有的配置文件)如果我必须创建另一个配置文件来运行测试(这是有道理的),但我想知道测试配置需要什么“魔法”才能运行 JiT 组件,现在我的 url 都是相对的。
webpack.config.js
let webpack = require('webpack');
let path = require('path');
let aot = require('@ngtools/webpack');
module.exports = {
entry: {
main: './Angular/main'
},
output: {
path: __dirname,
filename: './dist/smartcommand-[name].min.js',
// Lazy load modules by route & chunk
chunkFilename: './dist/smartcommand-[name].chunk.[hash].min.js'
},
resolve: {
extensions: ['.ts', '.js'],
modules: [
path.resolve('./'),
path.resolve('./node_modules')
],
alias: {
'ng2-charts/charts/charts': 'node_modules/ng2-charts/bundles/ng2-charts.umd.min.js'
//'ng2-dragula': 'node_modules/ng2-dragula/bundles/ng2-dragula.umd.min.js'
}
},
module: {
rules: [
// Ahead of Time Compilation
{ test: /\.ts$/, loader: '@ngtools/webpack', exclude: [/\.(spec)\.ts$/] },
// AoT requires all files to be loaded
{ test: /\.html$/, loader: 'html-loader' },
{ test: /\.css$/, loader: 'raw-loader' },
{
test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
loader: 'file-loader', options: { name: '[path][name].[ext]' }
}
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({ name: 'main' }),
// Ahead of Time Plugin
new aot.AngularCompilerPlugin({
tsConfigPath: path.resolve('./Angular/tsconfig.json'),
entryModule: path.resolve('./Angular/_app.module#SmartCommandModule')
// Use this setting to turn off AoT
//,skipCodeGeneration: true
}),
// Only load the necessary locales for moment
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|es/)
],
// Minimize webpack console output
stats: { assets: false, children: false }
};
karma .config.js
/* Karma Configuration */
'use strict';
module.exports = function (config) {
let appBase = 'Angular/'; // transpiled app JS and map files
config.set({
plugins: [
'karma-jasmine',
'karma-jasmine-html-reporter',
//'karma-chrome-launcher',
'karma-firefox-launcher',
// preprocessors
'karma-webpack',
'karma-sourcemap-loader', // show proper (un-bundled) stack traces
'karma-coverage', // capture unit test code coverage
'karma-trx-reporter' // report coverage in VSTS
],
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
//browsers: ['Chrome'],
browsers: ['Firefox'],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'karma-test-shim.js': ['webpack', 'coverage']
// for debugging the tests
//'karma-test-shim.js': ['webpack', 'sourcemap']
},
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// list of files / patterns to load in the browser
files: [
// polyfills
'node_modules/core-js/client/shim.js',
'Scripts/jquery-3.1.1.min.js',
'Scripts/jquery-ui-1.12.1.min.js',
'node_modules/moment/moment.js',
'node_modules/leaflet/dist/leaflet.js',
'node_modules/nipplejs/dist/nipplejs.js',
'node_modules/zone.js/dist/zone.js',
'node_modules/zone.js/dist/long-stack-trace-zone.js',
'node_modules/zone.js/dist/proxy.js',
'node_modules/zone.js/dist/sync-test.js',
'node_modules/zone.js/dist/jasmine-patch.js',
'node_modules/zone.js/dist/async-test.js',
'node_modules/zone.js/dist/fake-async-test.js',
// rxJS
{ pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false },
// other dependencies
{ pattern: 'node_modules/applicationinsights-js/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/applicationinsights-js/**/*.js.map', included: false, watched: false },
{ pattern: 'node_modules/ng2-charts/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/ng2-charts/**/*.js.map', included: false, watched: false },
'node_modules/chart.js/dist/Chart.bundle.js',
{ pattern: 'node_modules/primeng/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/ngx-slick/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/ng2-dragula/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/ng2-dragula/**/*.js.map', included: false, watched: false },
// our SmartCommand bundle
'dist/smartcommand-main.min.js',
// our Karma tests
{ pattern: 'karma-test-shim.js', included: true, watched: true },
// paths for debugging with source maps in dev tools
{ pattern: appBase + '**/*.ts', included: false, watched: false },
{ pattern: appBase + '**/*.js.map', included: false, watched: false },
// our assets (HTML & CSS) paths loaded via Angular's component compiler
{ pattern: appBase + '**/*.html', included: false, watched: true },
{ pattern: appBase + '**/*.css', included: false, watched: true },
{ pattern: 'Content/*.css', included: true, watched: false },
{ pattern: 'Content/*.css.map', included: false, watched: false },
{ pattern: 'Content/Images/**/*', included: false, watched: false },
{ pattern: 'Content/images/**/*', included: false, watched: false }
],
// proxied base paths for loading assets
proxies: {
// required for component assets fetched by Angular's compiler
'/Angular/': '/base/Angular/',
'/Content/': '/base/Content/'
},
// test results reporter to use
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress', 'kjhtml', 'coverage', 'trx'],
// karma code coverage
coverageReporter: {
// specify a common output directory
dir: 'coverage',
reporters: [
// reporters not supporting the `file` property
{ type: 'html', subdir: 'report-html' },
{ type: 'lcov', subdir: 'report-lcov' },
// reporters supporting the `file` property, use `subdir` to directly
// output them in the `dir` directory
{ type: 'cobertura', subdir: '.', file: 'cobertura.txt' },
{ type: 'lcovonly', subdir: '.', file: 'report-lcovonly.txt' },
{ type: 'teamcity', subdir: '.', file: 'teamcity.txt' },
{ type: 'text', subdir: '.', file: 'text.txt' },
{ type: 'text-summary', subdir: '.', file: 'text-summary.txt' }
]
},
// get code coverage in VSTS
trxReporter: { outputFile: 'test-results.trx', shortTestName: false },
// web server port
port: 9876,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// continuous integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: false,
// concurrency level
// how many browsers should be started simultaneous
concurrency: Infinity,
client: {
captureConsole: false, // set to true if you need console output
builtPaths: [appBase], // add more spec base paths as needed
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
// workaround for disconnects
browserDisconnectTolerance: 5,
browserNoActivityTimeout: 50000
});
};
karma 测试垫片
// 'No stack trace' is usually best for app testing.
Error.stackTraceLimit = 0;
// Uncomment to get full stacktrace output. Sometimes helpful, usually not.
//Error.stackTraceLimit = Infinity;
// Import all .spec.js files in our Angular folder
let appContext = require.context('./Angular', true, /\.spec\.js$/);
appContext.keys().forEach(appContext);
// Start the Test Environment
let testing = require('@angular/core/testing');
let browser = require('@angular/platform-browser-dynamic/testing');
testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting());
最佳答案
这是我遇到的问题。您实际上使用了两种不同的 Webpack 配置。显然,您的 webpack.config.js
是为 AoT 设置的。
但是,当您运行 Karma 时,您使用的是另一种不同的配置。 karma-webpack
插件为在 Karma 进程中运行的 Webpack 实例提供了自己的配置。除非您自己在 karma.config.js
中编写代码来读取 webpack.config.js
,否则 Karma 将完全忽略该文件。如此有效,当你运行 Karma 时,你正在运行不同的 Webpack 配置。问题是当前你的配置是空的,这意味着 Angular 正在处理 templateUrl
和 styleUrls
“原始”,你得到你得到的结果。
您需要为 Webpack 设置一个加载程序,该加载程序将处理 templateUrl
和 stylesUrls
让 Webpack 处理它们。我会用 angular2-template-loader
为了这。
查看您的配置,当 Karma 看到您的文件时,它们似乎都已被转换为 JavaScript。通常,angular2-template-loader
用于 TypeScript 文件,但由于它使用正则表达式完成工作,它也适用于 JavaScript 文件。
我希望将带有 angular2-template-loader
的 Webpack 配置添加到您的 karma.config.js
应该可以工作,并根据您项目的具体需求进行调整:
webpack: {
module: {
loaders: [
{
test: /\.js$/,
loaders: ['angular2-template-loader'],
// exclude: [...] You may want to exclude your test files here
// to save some build time.
},
// etc. with raw-loader, html-loader and file-loader as needed.
]},
}
关于angular - Angular 分量的绝对或相对 "templateUrls",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517360/
我正在尝试在项目中学习和添加 Angular 国际化。我只能理解 Angular 文档 (https://angular.io/guide/i18n-overview) 的编译时翻译。 我需要这样的东
在我的 Angular 应用程序中,基于登录用户,我想通过显示/隐藏不同的菜单项或允许/禁止某些路由来授予或限制功能。 目前成功登录后,我的 .NET Core API 会返回一个 JWT token
我是 Angular 的新手,目前我已经看过 angular.io 网站提供的一些示例。但是在component decorator在文档中的解释,它指出 Angular components are
这里是service employee-service.service.ts的代码 import { Injectable } from '@angular/core'; import { HttpC
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
如何正确安装 PUG/JADE 到 Angular 2 或更高版本 这样在工作和 AOT 和 JiT 的同时 工作单元和集成测试 并且在创建每个新组件时不会受到太多影响 最佳答案 我看到了很多解决方案
我的 Angular 12 应用程序中有一些通用组件,我计划将其创建为一个 Angular 库,以便其他应用程序也可以使用它。我们有一些应用程序在较低版本的 angular(例如 angular 8/
tl;dr; ng build 删除了包含我编译的自定义库的/dist 文件夹。这会使我项目代码中对该库的所有引用无效,从而导致 ng build 最终失败。我做错了什么? 我关注了documenta
我正在将一些“遗留”(非 typescript )js 库导入到我的 Angular SPA 中。 通常我只是从 cdn 添加一个负载到 index.html 就像: 在 Angular 分量中我只
我有这个 angular 应用程序,它基本上使用了库的概念。 我有 2 个名为 的库Lib1 和 lib2 根据他们所服务的微服务分组。 现在我将这些库导入主应用程序,即 应用1 事情一直到现在。 现
我在我的项目中启用了 angular Universal。我现在想完全删除它。我试图删除以下文件 /server.ts /webpack.server.config.js /src/tsconfig.
我已经有一个 AuthService 在登录时对用户进行身份验证,并且 AuthGuard 在未登录的情况下阻止访问。 某些页面我通过 UserProfile/Role 限制访问,但现在我需要阻止页面
我正在尝试使用 angular、TypeORM、SQLite 和其他组件作为 webpack 构建 Electron 应用程序。 我从在 GitHub 上找到的示例开始我的开发:https://git
我在从 Angular 8 更新到 9 并运行时遇到以下错误 ng 更新@angular/material: Package "@angular/flex-layout" has an incompa
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在我的 h1 元素“之前”创建一个小的程式化三 Angular 形图案,但我无法正确地圆 Angular 。右上角没问题,但其他两个有剪裁问题。 这是输出以及形状的放大图像: 使用的代码如下: h
我有一个 Angular 元素,带有自定义标记名 - fancy-button。如何将 fancy-button 嵌入 Angular 应用程序? 我已经尝试了以下方法,但都没有用 - 在 index
我已将我的项目从 angular 5.2.9 升级到 angular 6.0.0-rc.5。 除了包路径中的几个快速 RxJS 修复外,一切看起来都不错。(此链接非常有用:Want to upgrad
我是一名优秀的程序员,十分优秀!