Webpack:对 ng-include 使用 require

Posted

技术标签:

【中文标题】Webpack:对 ng-include 使用 require【英文标题】:Webpack: using require for ng-include 【发布时间】:2016-01-30 22:08:46 【问题描述】:

我是 webpack 的新手,现在我在我的一个 Angular 项目中第一次使用它。

我想在我的 html 文件中使用 require 函数,以便像这样要求 ng-include 的模板:

<div ng-include="require(./my-template.html)"></div>

我知道有像 ng-cache 和 ngtemplate 这样的加载器,但它们不能按我需要的方式工作。有了它们,我必须首先在 js 中使用模板,然后在我的 html 文件中使用模板名称。

如何做到这一点?

【问题讨论】:

创建指令是最简单的方法。然后您可以在指令中要求 - 否则查找加载程序 ***.com/questions/30605266/… 【参考方案1】:

你可以在 npm 上使用webpack-required-loader。

在您的应用 js 或模块 js 中添加注释:

//@require "./**/*.html" 

您可以在模板中使用

<div ng-include="'my-template.html'"></div>

Ngtemplate 可以正常工作。 Ng-cache 也可以。

还请注意,ng-include 指令中不需要相对路径,因为这是通过在入口文件的头部添加 //@require 命令来处理的。

最后,请注意,您必须使用双引号和单引号才能使 ng-include 工作。所以你会做"'template-name.html'",而不是"template-name.html",或者'template-name.html'

How config loaders

【讨论】:

你是如何设置装载机的? @MojtabaPourmirzaei,嗨。添加链接,如何配置加载器:) 似乎已经过时,出现新的 webpack 错误,例如:use must use require-loader not just require. 嗨,@davidbuttar!我不明白你 在你的文档中你会说'loader:'ng-cache'',但是当我运行它时,它会说一些像破坏性改变这样的东西,你必须包括 -loader 例如'loader: "ng-cache-loader"' 所以假设这个助手已经过时了。我现在避免使用 ng-include,所以不需要这个,但我想我提到了。【参考方案2】:

另一种方法是将my-template.html 转换为angular component: 假设您使用 html-loader 加载 HTML 文件 (loaders: test: /\.html/, loader: 'html'),请在模块 javascript 文件中定义一个组件 myTemplate

import myTemplate from './my-template.html';
angular.module(...)
  .component('myTemplate', template: myTemplate)

之后使用它:

<my-template></my-template>

【讨论】:

感谢您的建议! IMO 和我的用例,比其他答案更简单:) 这是一个很好的回应,但它没有回答这个问题:ng-include 条件呢?【参考方案3】:

您可以使用 HTML loader 和 angular $templateCache 服务

angular
    .module('template',[])
    .run(['$templateCache', function($templateCache) 
        var url = 'views/common/navigation.html';
        $templateCache.put(url, require(url));
    ]);

webpack 加载器配置:


    test: /\.html$/,
    loader: 'html',
    query: 
        root:sourceRoot
    

【讨论】:

谢谢,它可以工作而且很简单,不需要额外的加载器(我的意思是 html 加载器非常标准)。作为记录,它也适用于原始加载器,根据github.com/preboot/angular-webpack中找到的配置,如果包含的片段引用图像,则待测试(dev / prod)其他配置。 作为记录,我在github.com/PhiLhoSoft/Angular-Webpack-Playground 制作了上述项目的一个变体,我在其中添加了 ng-include,如您所示。【参考方案4】:

我已经在https://***.com/a/34815472/833093 上发布了这个,但是:

要启用您必须配置“relativeTo”参数,否则您的模板部分会在“/home/username/path/to/project/path/to/template/”加载(检查您的 bundle.js可能会在您的项目中泄露您的用户名)

var ngTemplateLoader = (
    'ngtemplate?relativeTo=' + path.resolve(__dirname, './src/') +
    '!html'
);

module.exports = 
    ...
    module: 
        loaders: [
            test: /\.html$/, loader: ngTemplateLoader,
        ],
    ,
    ...

然后在你的代码中,做一个副作用只需要:

// src/webapp/admin/js/foo.js
require('../../templates/path/to/template.html');

然后就可以加载html了:

<div ng-include src="'/webapp/templates/path/to/template.html'"</div>

【讨论】:

以上是关于Webpack:对 ng-include 使用 require的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ng-include 指令与内容交付网络一起使用?

AngularJS中ng-include指令实现头部和尾部的共用

AngularJS中ng-include指令实现头部和尾部的共用

AngularJs学习笔记——ng-include

角度传递范围到 ng-include

ng-show 不能与 ng-include 一起使用