首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何与一个不平凡的AngularJS应用程序和现有的普通配置进行集成?

我如何与一个不平凡的AngularJS应用程序和现有的普通配置进行集成?
EN

Stack Overflow用户
提问于 2017-05-02 04:08:10
回答 2查看 1.6K关注 0票数 4

我目前正在创建一个新的React组件,该组件需要与现有的角1.x应用程序集成,该应用程序本身已经有了以Grunt为中心的自己的构建过程。在某个时候,应用程序可能会被迁移到完全反应,但现在只有这一个组件将在React中完成。

该角应用程序有一个广泛的构建过程围绕它建立使用咕噜,所以任何新组件的构建都必须能够通过咕噜以及。

到目前为止,另一个开发人员已经开始使用反应启动器套件开发React组件,其中包括React、Webpack、Babel、可以旋转的开发服务器,以及各种其他功能。

这就是我最初研究的目的,也是我目前遇到的障碍:

  • 看起来,ngReact将是将React组件集成到应用程序中的一个很好的工具。
  • 当前的React安装程序可以使用React应用程序的嵌入式构建(没有实际可用的构建文件)旋转开发服务器,也可以创建一个小型化并随时可以发布的“产品”构建。这不太好用,因为我需要它来创建当前应用程序和ngReact可以消费的东西。
  • 该反应应用程序正在使用Webpack捆绑。有一种能让webpack吐露心声的牢骚工具。

我如何将所有这些移动部件放在一起,将反应组件捆绑到现有的角度应用程序中,同时尽可能地保留现有的配置?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-02 04:08:10

以下是解决这个问题所需的步骤(为保护无辜而更改了组件/文件名):

  1. 让Webpack输出一个我以后可以在ngReact中使用的构建。在webpack.config.js中,我必须将output:{ path: 'build' }更改为build_react,以便以后不会被角构建过程覆盖。另外,在module.loaders中,我添加了下面所示的预设行,以使其输出非ES6,有效的JavaScript: //与Babel一起处理JS。{ test: /.(js\js)$/,包括: paths.appSrc,加载程序:‘babel’,查询:{预设:'env','react',}}
  2. 安装grunt-webpack使用npm,并配置它使用一个链接webpack配置文件。这个文件会与所有其他类似的配置一起被拉到grunt initConfig中。 //webpackConfig.js module.exports.name = ' webpack ';const webpackConfig =需要量(‘../webpac.config.dev.js’);/** *拉动我们的反作用webpack构建*/ module.exports.getConfiguration =函数(Grunt){返回{ options:{ stats:!process.env.NODE_ENV而行行process.env.NODE_ENV === 'development‘},prod: webpackConfig,dev: webpackConfig };};
  3. 在我们的react.js文件中包括react.jsreact-dom.jsng-react.min.js以及在#1中构建的包。(稍后将这些文件连接到一个用于生产构建的文件中。)关键是,必须在所有角文件(包括所有应用程序.js文件)之后包含包,以便React组件在下一步能够访问angular对象。
  4. 将这一行添加到React组件中,这样ngReact就可以工作:angular.module('angularModule').value('MyComponent', MyComponent);
  5. 将以下内容添加到包含React组件的角模板中:<react-component name="MyComponent"></react-component>

经过所有这些步骤,它终于成功了!如果将来有人遇到这个问题,希望这能帮助人们把这些步骤组合起来。

票数 3
EN

Stack Overflow用户

发布于 2018-08-06 22:27:48

我也有同样的问题要集成到当前AngularJs构建过程中,但是作为一个单独的应用程序。可能对你有帮助。

下面是React的完整配置:

它创建一个单独的任务,以便使用唯一的名称进行响应,这样您就可以随意地操作它们。

项目的Gruntfile.js:

代码语言:javascript
复制
module.exports = function (grunt) {

let concat = {};
let clean = {};
let uglify = {};
let copy = {};
let htmlmin = {};
let cssmin = {};
let browserify = {};
let watch = {};
let template = {};
let run = {};

/* React configuration. */

const reactSourcePath = './source';
const reactCompiledPath = './client';
const reactHtmlPathDest = './client/index.html'
const reactTargetName = "react";
const reactFileName = "react_main";

/* ### TASK CONFIGURATIONS ### */ 

/* Clean compiled files. */
clean[reactTargetName] = [
    `${reactCompiledPath}`
];

/* Concatenate all CSS files to one. */
const cssConcatSourceTemplate = `${reactSourcePath}/**/**.css`;
const cssDestinationFile = `${reactCompiledPath}/css/${reactFileName}.css`;

concat[reactTargetName] = {
    src: [cssConcatSourceTemplate],
    dest: cssDestinationFile
};

/* Convert JSX to JS, prepare JS files for a browser and copy to the destination. */
const jsSourceFile = `${reactSourcePath}/index.js`;
const jsDestinationFile = `${reactCompiledPath}/js/${reactFileName}.js`;

browserify[reactTargetName] = { 
    options: {
        transform: [['babelify', {presets: ['es2015', 'react']}]]
    },
    files: {
        [jsDestinationFile]: jsSourceFile
    }
};

/* Replace js/css placeholders and copy html file to destination. */
const applicationData = {
    css: [
        './css/react_main.css'
    ],
    js: [
        './js/react_main.js'
    ]
};

var jsFiles = "";
var cssFiles = "";

applicationData.css.forEach(function(item) {
    cssFiles = cssFiles + `\n<link rel="stylesheet" type="text/css" href=${item}>`;
});

applicationData.js.forEach(function(item) {
    jsFiles = jsFiles + `\n<script type="text/javascript" src=${item}></script>`;
});

template[reactTargetName] = {
    options: {
        data: {
            appName: '<%= pkg.name %>' + '-react',
            productVersion: '<%= pkg.version %>',
            reactEmbeddedCssFiles: cssFiles,
            reactEmbeddedJsFiles: jsFiles
        }
    },
    files: {
        [`${reactHtmlPathDest}`]: `${reactSourcePath}/index.template.html`,
    }
};

/* Uglify react JS file. */
uglify[reactTargetName] = { 
    files: {
    [jsDestinationFile]: jsDestinationFile
}
};

/* Copy bootstrap CSS/JS files. */
copy[reactTargetName] = {
    files: {
        [`${reactCompiledPath}/css/bootstrap.min.css`]: 'node_modules/bootstrap/dist/css/bootstrap.min.css',
        [`${reactCompiledPath}/js/bootstrap.min.js`]: 'node_modules/bootstrap/dist/js/bootstrap.min.js',
        [`${reactCompiledPath}/js/jquery.min.js`]: 'node_modules/jquery/dist/jquery.min.js',
    }
}

/* Minify HTML files. */
htmlmin[reactTargetName] = {
    options: {
        removeComments: true,
        collapseWhitespace: true
    },
    files: {
        [`${reactHtmlPathDest}`]: `${reactHtmlPathDest}`
    }
};

/* Minify react CSS file. */
cssmin[reactTargetName] = {
    files: {
        [cssDestinationFile]: cssDestinationFile 
    }
};

/* Watch for any changes in react app. 
There are three separate watches for css, js, and html files. */
watch[reactTargetName + '_css'] = {
    files: [`${reactSourcePath}/**/*.css`],
    tasks: [`concat:${reactTargetName}`],
    options: {
        livereload: true
    }
};

watch[reactTargetName + '_js'] = {
    files: [`${reactSourcePath}/**/*.js`],
    tasks: [`browserify:${reactTargetName}`],
    options: {
        livereload: true
    }
};

watch[reactTargetName + '_hmtl'] = {
    files: [`${reactSourcePath}/**/*.html`],
    tasks: [`template:${reactTargetName}`],
    options: {
        livereload: true
    }
};

/* Jest tests */
jestTestsTaskName = reactTargetName + '_jest_tests';
run[jestTestsTaskName] = {
    exec: 'npm test'
  };

/* Generate task names for react. */

var reactTasks = {
    debug: [
        "clean", 
        "browserify", 
        "concat", 
        "copy", 
        "template"
    ].map(x => x + `:${reactTargetName}`),
    release: [
        "clean", 
        "browserify", 
        "concat", 
        "copy", 
        "template", 
        "htmlmin", 
        "uglify", 
        "cssmin"
    ].map(x => x + `:${reactTargetName}`)
};

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch:watch,
    copy:copy,
    concat:concat,
    clean:clean,
    uglify:uglify,
    template:template,
    browserify: browserify,
    htmlmin: htmlmin,
    cssmin: cssmin,
    run:run
});

grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-template');
grunt.loadNpmTasks("grunt-browserify");
grunt.loadNpmTasks("grunt-contrib-htmlmin");
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-run');

grunt.registerTask('react_build_debug', reactTasks.debug);
grunt.registerTask('react_build_release', reactTasks.release);

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43729956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档