LoginSignup
24
12

More than 5 years have passed since last update.

Angular で template内補完やエラーチェックできるようになったよ

Last updated at Posted at 2016-12-28

 @Quramy 

Angular + Angular 2Angular



screencast
Angular Component

VimVisual Studio Codehttps://github.com/angular/vscode-ng-language-service VSCplugin

Emacs, Vim, Sublime Text 使Angular1
 tsserver2 TypeScript
2015TypeScriptjspmimport TypeScript




  1. ターミナルを開いて(angular-cli等で作った)プロジェクトのルートディレクトリに移動
  2. npm install typescript @angular/language-service reflect-metadata で必要なNPMパッケージをインストール
  3. 以下のコマンドを実行
curl 'https://raw.githubusercontent.com/Quramy/ng-tsserver/master/ng-tsserver' | bash

2.tsserverAngular
TypeScripttsservertsserver3




Angular@angular/language-serviceNPM@angular Angular2.3chuckjazCompiler

Angular4README
使.d.ts
ts_plugin.d.ts
import * as ts from 'typescript';
/** A plugin to TypeScript's langauge service that provide language services for
 * templates in string literals.
 *
 * @experimental
 */
export declare class LanguageServicePlugin {
    private serviceHost;
    private service;
    private host;
    static 'extension-kind': string;
    constructor(config: {
        host: ts.LanguageServiceHost;
        service: ts.LanguageService;
        registry?: ts.DocumentRegistry;
        args?: any;
    });
    /**
     * Augment the diagnostics reported by TypeScript with errors from the templates in string
     * literals.
     */
    getSemanticDiagnosticsFilter(fileName: string, previous: ts.Diagnostic[]): ts.Diagnostic[];
    /**
     * Get completions for angular templates if one is at the given position.
     */
    getCompletionsAtPosition(fileName: string, position: number): ts.CompletionInfo;
}

見るからにTypeScriptのLanguageServiceと親和性のありそうな定義ですね。実際、TypeScript本体の.d.tsをひも解くと以下の記述があります。

typescript.d.ts
namespace ts {
    // 一部抜粋
    function createLanguageService(host: LanguageServiceHost, documentRegistry?: DocumentRegistry): LanguageService;

    interface LanguageService {
        getSyntacticDiagnostics(fileName: string): Diagnostic[];
        getCompletionsAtPosition(fileName: string, position: number): CompletionInfo;
        // 他にも色々メソッドが生えている
    }
}

tsserverAngular LanguageService


(一)TypeScriptcreateLanguageService 

(二) createLanguageService LanguageServiceAngularLanguageService

(三)tsserver2.createLanguageService


3.TypeScriptfork使
tsserverrequire
tsserverlibrary.jsTypeScriptserver使

TypeScript.js ts() ts.createLanguageService  Property Descriptor
const NgLanguageServicePlugin = require("@angular/language-service")().default;

if (typeof ts === "undefined") ts =  {};
var delegate;

Object.defineProperty(ts, "createLanguageService", {
  get: function() {
    return function(host, documentRegistry) {
      const ls = delegate(host, documentRegistry);
      const nglsp = new NgLanguageServicePlugin({
        host: host,
        service: ls,
        registry: documentRegistry
      });

      // オリジナルのメソッドを退避
      const completionFn = ls.getCompletionsAtPosition;
      const samnticCheckFn = ls.getSemanticDiagnostics;

      // LanguageServiceのメソッドをラップ
      ls.getCompletionsAtPosition = (filename, position) => {
        const ngResult = nglsp.getCompletionsAtPosition(filename, position);
        if (ngResult) return ngResult;
        return completionFn(filename, position);
      };
      ls.getSemanticDiagnostics = (fileName) => {
        return nglsp.getSemanticDiagnosticsFilter(fileName, samnticCheckFn(fileName));
      };
      return ls;
    }
  },
  set: function(v) {
    delegate = v;
  },
  configurable: true,
  enumerable: true
});
var ts; // tsserver.jsに定義されてる

tsserverts.createLanguageService getterLanguageService
.jstsserver.jsappend
(function(ts) {
  // tsserverの本体実装
  // ↓みたいのがどっかにいる
  // ts.createLanguageService = function() {...};
})(ts || {}); // この時点で ts.LanguageServicePluginにはProperty Descriptorが適用されている

おわりに


AngularLanguageServiceTypeScriptLanguageService

AngularLanguageServiceAoT@angular/compiler
Angular AoT


ngcHTML.ngfactory.tsbundle.ngfactory.tsJavaScriptbundle
HTML(TypeScript)


 + LanguageService使

node_modules.jsPR

 (2017.04.16)
TypeScript 2.3.x Language Service PluginLanguageService

脚注



  1.  http://angularjs.blogspot.jp/2015/09/angular-2-survey-results.html VimSublime 



    http://qiita.com/Quramy/items/c2835bc380c3e822d479 



    Tsuquyomi(Vim)tsservertide(Emacs)https://github.com/ananthakumaran/tide#faq  



    10 
24
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

24
12