Объединение и минимизация модульного JavaScript (RequireJS/AMD) с помощью ASP.NET MVC
Есть ли у кого-нибудь опыт или какие-либо хорошие решения для связывания и минимизации модульного JavaScript, например RequireJS/AMD, в проекте ASP.NET MVC?
Лучший способ использовать Оптимизатор RequireJS (возможно, в post post action?) - или там что-то лучше для ASP.NET MVC?
Ответы
Ответ 1
Я думаю, что проблема, с которой вы столкнетесь, - это использование анонимных определений. Если вам нужен объединенный/связанный файл script, содержащий все ваши определения, вы должны будете назвать их.
например.
define("someModule", ["jquery", "ko"], function($,ko) { ... });
вместо
define(["jquery", "ko"], function($,ko) { ... });
Если вы используете имена файлов в качестве имен модулей, вы сможете загрузить их асинхронно (не в комплекте), а также предварительно загруженные (в комплекте). Таким образом, вы можете работать в режиме отладки, а также в режиме выпуска без необходимости изменения.
У меня нет опыта работы с оптимизатором RequireJS, чтобы узнать, не зависит ли он от анонимного.
UPDATE:
Мне недавно пришлось это сделать, и одна из проблем, с которыми я столкнулся, - это атрибут data-main тега загрузки script require.js. Поскольку файл main.js имеет зависимости от связанных модулей, их необходимо загрузить до main.js, но после require.js. Поэтому мне пришлось перерезать основные данные и загрузить этот файл (разделенный) последним.
от
<script src="../JS/require-v2.1.2.js" type="text/javascript" data-main="main.js"></script>
к
<script src="../JS/require-v2.1.2.js" type="text/javascript"></script>
<%: System.Web.Optimization.Scripts.Render("~/bundles/signup") %>
<script src="main.js" type="text/javascript"></script>
Я не смотрел, но если конфигурация пакета может гарантировать, что main.js является последним, тогда даже не понадобится тег script.
Ответ 2
Это шаги для получения RequireJS в комплекте с main.js. Вы можете перейти к одной строке в теге <head>
. Это не затрагивает проблему с анонимными определениями.
HTML
<head runat="server">
<title></title>
<%: System.Web.Optimization.Scripts.Render("~/bundles/scripts") %>
</head>
BundleConfig.cs
using System.Web;
using System.Web.Optimization;
public class BundleConfig
{
// For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/scripts").Include(
"~/scripts/libs/require.js",
"~/scripts/main.js"));
}
}
main.js должен работать без основной информации (мне нужно было установить baseUrl)
require.config({
baseUrl: "scripts"
});
Ответ 3
Я не уверен, что это приемлемое решение или нет, но Visual Studio 2012 имеет пакет NuGet (Microsoft.Web.Optimization), который поддерживает родную минификацию и комплектацию. Я не уверен, что он доступен для 2010
Это одна строка кода в application_start
Microsoft.Web.Optimization.BundleTable.Bundles.EnableDefaultBundles();
http://msdn.microsoft.com/en-us/vs11trainingcourse_aspnetandvisualstudio_topic5
Ответ 4
Я знаю, что это старый вопрос, но вы можете взглянуть на RequireJS.NET Compressor (использует компрессор YUI, а не пакет ASP.NET - по крайней мере на данный момент), который является частью пакета RequireJS.NET NuGet.
Ссылки:
Компрессор - http://requirejsnet.veritech.io/compressor.html
Общая документация - http://requirejsnet.veritech.io/
Проект Github - https://github.com/vtfuture/RequireJSDotNet
NuGet - https://www.nuget.org/packages/RequireJsNet/