Как сделать приложение angular принимать аргументы из командной строки?

У меня есть приложение AngularJS, в котором мой код выглядит примерно так:

myApp = angular.module('myApp',
  [
    'ui.router',
    'ngMaterial',
    'ngMessages'
  ]
);

myApp.constant('CONSTANTS', (function() {
  // Define your variable
  return {
    backend: {
      baseURL: 'http://mybackend.com:3026'
    }
  };
})());

Я запускаю это приложение, используя http-server на номере порта 8000 следующим образом:

% http-server -p 8000

Я хочу передать аргумент командной строки для backend.baseURL, чтобы он превысил значение, указанное в коде. Как я могу это сделать?

Ответы

Ответ 1

Вам нужен, по крайней мере, необходимый http-сервер, поддерживающий динамический контент. пока ваш http-сервер поддерживается только статическим контентом.

И в комментарии вы спрашиваете, какой сервер вы должны использовать. Существуют тысячи веб-серверов, поддерживающих динамический контент. но в настоящее время вы используете http-server, я предполагал, что вам нужен небольшой сервер для локальных разработчиков.

К сожалению, я не могу найти сервер, который будет поддерживать ваши потребности, не изменяя их код. Поэтому я предлагаю вам создать свою собственную серверную базу в библиотеке на npm.

Это и пример сервера, использующий live-server.

var liveServer = require("live-server");
var fs = require("fs")

var root = process.argv[2] || "."
var port = process.argv[3] || 8000

var replaceTextMiddleWare = function(req, res, next){

    var file = process.argv[4]
    var find = process.argv[5]
    var replace = process.argv[6]

    if(file && find){
        if(req.url === file) {
                fs.readFile( root + file, "utf-8", function(e, content){
                    res.end( content.replace(find, replace))
                } )

                return;
        }
    }


    next();
}

var params = {
    port: port, // Set the server port. Defaults to 8080.
    host: "0.0.0.0", // Set the address to bind to. Defaults to 0.0.0.0 or process.env.IP.
    root: root, // Set root directory that being server. Defaults to cwd.
    open: false, // When false, it won't load your browser by default.
    ignore: 'scss,my/templates', // comma-separated string for paths to ignore
    file: "index.html", // When set, serve this file for every 404 (useful for single-page applications)
    wait: 1000, // Waits for all changes, before reloading. Defaults to 0 sec.
    mount: [['/components', './node_modules']], // Mount a directory to a route.
    logLevel: 2, // 0 = errors only, 1 = some, 2 = lots
    middleware: [ replaceTextMiddleWare ] // Takes an array of Connect-compatible middleware that are injected into the server middleware stack
};


liveServer.start(params);

Затем вы можете запустить свой сервер

nodejs myserver.js /mydocument/myproject/ 8000 config.js "http://mybackend.com:3026" "http://mydevserver.com:80"

Команда принимает параметры:

  • Путь для обслуживания контента
  • Порт
  • Имя файла
  • Текст для поиска
  • Текст для замены

Этот сервер поддерживает только один динамический файл с простой функцией find/replace. С этого момента, я думаю, вы можете изменить промежуточное ПО, чтобы делать все, что хотите.

Ответ 2

когда Ive сделал это в процессе производства, я использую для этого процесс сборки, используя gulp в этом случае

  var knownOptions = {
    string: 'env',
    default: { env: process.env.NODE_ENV || 'default' }
  };

  var options = minimist(process.argv.slice(2), knownOptions);

  console.log("using config : " + chalk.blue(options.env));

мы получаем переменную окружения, по умолчанию использующую значение по умолчанию, используя minimist, мы можем передать -env 'string'

затем далее в коде, нажимая динамический файл на app.js

  //now we use options.env
  appJS.push("env/"+options.env+".js");

env/[options.env].js - это модуль angular, который экспортирует специфические для среды константы

Ответ 3

похоже, что вы не используете gulp, но используете node script из package.json. если вы используете gulp, тогда это не проблема, с которой вы используете http-сервер через gulp. одна вещь, которую вы можете сделать в своем текущем случае, является частью вашей команды запуска, задайте process.env.baseUrl = "dynamic", а затем, грубо говоря, используйте это в своем коде, как это

return {
backend: {
  baseURL:process.env.baseUrl || 'http://fallbackurl'
}

Ответ 4

В основном я понимаю, что вы хотите настроить пакет http-server для своей выигравшей пользовательской обработки.

Вот небольшое решение, которое я нашел для вас....

Перейдите в папку установки node (в моем случае ее локальная)...

Итак, путь файла, который мы будем редактировать, выглядит следующим образом:

../node_modules/http-server/lib/http-server.js

Импортируйте один пакет, который поможет вам получить аргументы командной строки... вам не нужно его устанавливать, его уже есть.

var argv = require('optimist').boolean('cors').argv; // add this line at верх после номера строки 7

Теперь

В строке 60 и после кода before.push(function (req, res) { добавьте следующий код.

if( req.url === '/backend-url' ) {
  return res.end(JSON.stringify(argv.x));
}

Итак, перед тем, как функция push будет выглядеть так:

  before.push(function (req, res) {
    if( req.url === '/backend-url' ) {
      return res.end(JSON.stringify(argv.x));
    }
    if (options.logFn) {
      options.logFn(req, res);
    }

    res.emit('next');
  });

теперь мы настроили наш новый аргумент командной строки x для http-сервера, который будет возвращен для url "/backend-url"

Теперь на переднем конце

myApp.constant('CONSTANTS', ('$http', function($http) {
// Define your variable
**var backendURL = (function() {
    return $http.get('/backend-url', function(bUrl) {
        return bUrl;
    })
})();**
return {
    backend: {
        baseURL: backendURL
    }
};
})());

Done, now you add url like this: **http-server -p 8080 -x http://example.com**

I choose this approch as replacing file content i dont think good in you case 

Ответ 5

Если вы используете только один экземпляр вашего приложения, вы можете запустить его с помощью script, который принимает все необходимые аргументы командной строки, заменяет соответствующие заполнители (строка между конкретными комментариями, например) в ваших файлах js приложения, а затем запускает http-server на нужном порту.