Ace文本编辑器 - 如果源被缩小,"require"将失败

Cie*_*iel 1 javascript ace-editor angularjs

我试图使用ace文本编辑器angular,其中一个需要的行为需要调用ace.require.

我已经包含了相应的文件,但我看到如果我缩小我的javascript源代码,那就不再适用了.这显然是因为路径变得无效,但我不确定如何处理这种情况,除了在我的优化包之外手动加载所提到的文件.我ASP.NET MVC Web Optimization Framework用来加载我的javascripts作为紧凑和缩小的"捆绑".

我正在使用ui-ace指令来加载它,但我已经测试过没有任何指令,无论我是否正在通过角度,行为都是一样的.

还有其他人发现了解决方法吗?

这是非常简单的代码......

bundles.Add( new ScriptBundle( "~/bundles/js/ace" )
    // include the ace text editor
    .Include( "~/application/assets/scripts/ace/ace.js" )
    .Include( "~/application/assets/scripts/ace/ext-language_tools.js" )));
Run Code Online (Sandbox Code Playgroud)

使用Javascript

    if (angular.isDefined(opts.require)) {
        opts.require.forEach(function (n) {
            window.ace.require(n);
        });
    }
Run Code Online (Sandbox Code Playgroud)

这也可以明确键入...

ace.require('ace/ext/language_tools');
Run Code Online (Sandbox Code Playgroud)

HTML

<div ng-model="Model.Scripting"
     ui-ace="{
        useWrapMode: true,
        showGutter: true,
        theme: 'chrome',
        mode: 'javascript',
        require: ['ace/ext/language_tools'],
        advanced: {
            enableSnippets: true,
            enableBasicAutocompletion: true,
            enableLiveAutocompletion: true
        }
    }">
</div>
Run Code Online (Sandbox Code Playgroud)

怎么重现

既然不能想出一个办法让整个事情给你,正是因为它需要是,我已经重新使用的行为nodejs,bowergulp.

NODE JS/BOWER

首先在nodejs中的新文件夹中运行这些命令.

npm install bower npm install gulp npm install gulp-concat npm install gulp-rename npm install gulp-uglify npm install run-sequence

bower install angular bower install ace-builds bower install angular-ui-ace

GULP

您可以使用它gulpfile.js来构建脚本文件.

var
  gulp = require('gulp'),
  concat = require('gulp-concat'),
  rename = require('gulp-rename'),
  uglify = require('gulp-uglify'),
  sequence = require('run-sequence');

gulp.task('default', function() {
  return sequence([
    "ace"
  ]);
});

gulp.task('ace', function() {
  return gulp.src([
    'bower_components/angular/angular.js',
    'bower_components/angular-ui-ace/ui-ace.js',

    'bower_components/ace-builds/src-noconflict/ace.js',
    'bower_components/ace-builds/src-noconflict/mode-javascript.js',
    'bower_components/ace-builds/src-noconflict/worker-javascript.js',
    'bower_components/ace-builds/src-noconflict/theme-chrome.js',
    'bower_components/ace-builds/src-noconflict/snippets/text.js',
    'bower_components/ace-builds/src-noconflict/snippets/javascript.js'])
    .pipe(concat('scripts.js'))
    .pipe(uglify())
    .pipe(gulp.dest('js'));
});
Run Code Online (Sandbox Code Playgroud)

INDEX.HTML

这是一个可以重现问题的HTML文件.

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="js/scripts.js"></script>
    <script type="text/javascript">
        (function () {
            var ace = window.ace = window.ace || { };
            ace.initialize = function(editor) {
                ace.require("ace/ext/language_tools");

                editor.setTheme("ace/theme/chrome");
                editor.getSession().setMode("ace/mode/javascript");

                // options
                editor.setOptions({
                    showGutter: true,
                    showPrintMargin: false,
                    enableBasicAutocompletion: true,
                    enableSnippets: true,
                    enableLiveAutocompletion: true,
                    fontSize: '14px',
                    fontFamily: 'Consolas'
                });
            };
        })();
    </script>
    <script type="text/javascript">
        angular.module('app', ['ui.ace'])
                .controller('HomeController',['$scope', function($scope){
                    $scope.aceLoaded = function(_editor){
                        ace.initialize(_editor);
                    };

                    $scope.Model = {
                        Scripting: ""
                    }
                }]);
    </script>
</head>
<body ng-app="app" ng-controller="HomeController">
    <div ui-ace="{ onLoad: aceLoaded }"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

a u*_*ser 6

对于ace.require工作,你需要添加ext-language_tools到你的 gulp.task("ace")

'bower_components/ace-builds/src-noconflict/ace.js',
'bower_components/ace-builds/src-noconflict/ext-language_tools.js',
'bower_components/ace-builds/src-noconflict/mode-javascript.js',
Run Code Online (Sandbox Code Playgroud)

bower_components/ace-builds/src-noconflict/worker-javascript.js因为它需要在webworker中加载,所以在bundle中不需要.为此,您需要将workerPath配置为指向正确的文件夹

ace.initialize = function(editor) {
    ace.require("ace/config").set("workerPath",
        "bower_components/ace-builds/src-min-noconflict");
    ace.require("ace/ext/language_tools");
Run Code Online (Sandbox Code Playgroud)

并且因为它的高度设置为0,因为ace最初不可见,请参阅此问题:Ace编辑器不能与引导程序一起使用

另请注意,fontFamily: 'Consolas'在缺少该字体的系统上可能会出现问题,因此最好将备用数据添加到等宽字体中fontFamily: 'Consolas', monospace