2017-05-04 6 views
3

私はこれを最後の2日間試しましたが、期待どおりに動作させることができません: 私自身のJavaScriptライブラリをビルドし、既存の名前空間(この特定のケースでは "OCA")。あなたが理解しているように、私はタイプコピーやモジュールを介したタイプセーフティのような現代的なアプローチなしに強制されることを強いられたくありません。webpackの外部としてライブラリを設定すると、UMDでlibraryTargetとして機能しません

したがって、webpack 2libraryTarget: umdを使用して、出力を「OCA.Ocr」(私のライブラリは「Ocr」という名前)に登録します。これは意図したように機能しますが、例えばのアンダースコアのを使用したい場合には、アプリケーションでグローバルに利用できるようになるため、ライブラリも配信されなければなりません。 私はWebPACKのコンフィギュレーションマニュアルに続き、それが外観設定オプションを移動するための方法であることを述べている:ガイドが提案したように、私はそれを使用しますが、それは動作しません

externals: { // object 
    angular: "this angular", // this["angular"] 
    react: { // UMD 
     commonjs: "react", 
     commonjs2: "react", 
     amd: "react", 
     root: "React" 
    } 
    } 
    // Don't follow/bundle these modules, but request them at runtime from the environment 

/* global __dirname, require, module*/ 

const webpack = require("webpack"); 
const UglifyJsPlugin = webpack.optimize.UglifyJsPlugin; 
const path = require("path"); 

module.exports = function (env) { 
    let target = env.target; 

    let libraryName = ["OCA", "Ocr"]; 

    let plugins = []; 
    let outputFile; 

    if (target === "production") { 
    plugins.push(new UglifyJsPlugin({ minimize: true })); 
    } 
    outputFile = "ocr[name].min.js"; 

    const config = { 
    entry: { 
     app: __dirname + "/src/app.ts", 
     personal: __dirname + "/src/personal.ts" 
    }, 
    output: { 
     path: __dirname + "/dist", 
     filename: outputFile, 
     library: libraryName, 
     libraryTarget: "umd", 
     umdNamedDefine: true 
    }, 
    module: { 
     rules: [ 
     { 
      test: /\.ts$/, 
      enforce: "pre", 
      loader: "tslint-loader", 
      options: { 
      tsConfigFile: "tsconfig.app.json", 
      } 
     }, 
     { 
      test: /\.ts?$/, 
      loader: "ts-loader", 
      exclude: /node_modules/, 
      options: { 
      configFileName: "tsconfig.app.json" 
      } 
     } 
     ], 
    }, 
    resolve: { 
     modules: [path.resolve("./src")], 
     extensions: [".ts"], 
    }, 
    externals: { 
     underscore: { // UMD 
     commonjs: "underscore", 
     commonjs2: "underscore", 
     amd: "underscore", 
     root: "_" 
     } 
    }, 
    plugins: plugins, 
    }; 

    return config; 

} 

アンダーライブラリを使用してマイapp.tsファイル(例えば、もちろん常に使用するのが最善ではありません_.defer方法は、)そのようになっています

は、私は、アプリケーションでそれを含めても、私のlibには、ブラウザによってロードされる前にunderscorejsライブラリがロードされてきていることを確認しますが、コンソール出力は、まだ状態:(

TypeError: underscore_1.default is undefined

コンパイルの出力は以下のとおりです。おそらくこれはちょっと役立ちます):

(function webpackUniversalModuleDefinition(root, factory) { 
    if(typeof exports === 'object' && typeof module === 'object') 
     module.exports = factory(require("underscore")); 
    else if(typeof define === 'function' && define.amd) 
     define("Ocr", ["underscore"], factory); 
    else if(typeof exports === 'object') 
     exports["Ocr"] = factory(require("underscore")); 
    else 
    root["OCA"] = root["OCA"] || {}, root["OCA"]["Ocr"] =  factory(root["_"]); 
})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) { 
return /******/ (function(modules) { // webpackBootstrap 
/******/ // The module cache 
/******/ var installedModules = {}; 
/******/ 
/******/ // The require function 
/******/ function __webpack_require__(moduleId) { 
/******/ 
/******/  // Check if module is in cache 
/******/  if(installedModules[moduleId]) { 
/******/   return installedModules[moduleId].exports; 
/******/  } 
/******/  // Create a new module (and put it into the cache) 
/******/  var module = installedModules[moduleId] = { 
/******/   i: moduleId, 
/******/   l: false, 
/******/   exports: {} 
/******/  }; 
/******/ 
/******/  // Execute the module function 
/******/  modules[moduleId].call(module.exports, module,  module.exports, __webpack_require__); 
/******/ 
/******/  // Flag the module as loaded 
/******/  module.l = true; 
/******/ 
/******/  // Return the exports of the module 
/******/  return module.exports; 
/******/ } 
/******/ 
/******/ 
/******/ // expose the modules object (__webpack_modules__) 
/******/ __webpack_require__.m = modules; 
/******/ 
/******/ // expose the module cache 
/******/ __webpack_require__.c = installedModules; 
/******/ 
/******/ // identity function for calling harmony imports with the correct  context 
/******/ __webpack_require__.i = function(value) { return value; }; 
/******/ 
/******/ // define getter function for harmony exports 
/******/ __webpack_require__.d = function(exports, name, getter) { 
/******/  if(!__webpack_require__.o(exports, name)) { 
/******/   Object.defineProperty(exports, name, { 
/******/    configurable: false, 
/******/    enumerable: true, 
/******/    get: getter 
/******/   }); 
/******/  } 
/******/ }; 
/******/ 
/******/ // getDefaultExport function for compatibility with non-harmony  modules 
/******/ __webpack_require__.n = function(module) { 
/******/  var getter = module && module.__esModule ? 
/******/   function getDefault() { return module['default']; } : 
/******/   function getModuleExports() { return module; }; 
/******/  __webpack_require__.d(getter, 'a', getter); 
/******/  return getter; 
/******/ }; 
/******/ 
/******/ // Object.prototype.hasOwnProperty.call 
/******/ __webpack_require__.o = function(object, property) { return  Object.prototype.hasOwnProperty.call(object, property); }; 
/******/ 
/******/ // __webpack_public_path__ 
/******/ __webpack_require__.p = ""; 
/******/ 
/******/ // Load entry module and return exports 
/******/ return __webpack_require__(__webpack_require__.s = 2); 
    /******/ }) 
/************************************************************************/ 
/******/ ([ 
/* 0 */, 
/* 1 */ 
/***/ (function(module, exports) { 

module.exports = __WEBPACK_EXTERNAL_MODULE_1__; 

/***/ }), 
/* 2 */ 
/***/ (function(module, exports, __webpack_require__) { 

"use strict"; 

Object.defineProperty(exports, "__esModule", { value: true }); 
var underscore_1 = __webpack_require__(1); 
var App = (function() { 
    function App() { 
     underscore_1.default.defer(function() { 
      console.log('test'); 
     }); 
    } 
    return App; 
}()); 
exports.App = App; 
exports.$app = new App(); 


/***/ }) 
/******/ ]); 
}); 

これがどのように機能しているのか、私は何をしなければならないでしょうか?私は完全に失われており、今あなたの助けを望んでいます。

Btw:Thisも私のために働いていません。

+0

。私はそれが修正されたときに更新を提供します。 – janis91

+0

私はまた、AMDの同じ問題に直面している –

答えて

3

私はあなたと同じ問題がありますが、libraryTargetオプションにvarプロパティを設定すると、変数は定義されなくなります。多分これはあなたを助ける:私も[GitHubの](https://github.com/webpack/webpack/issues/4824)でこれを尋ね、それが、これはバグであること、判明

externals: { 
    "lodash": { 
     var:'_' 
    } 
} 
+1

私の一日を保存しました、ありがとう!しかし、なぜ?この「var」プロパティについては公式ドキュメント(https://webpack.js.org/configuration/externals/ – H0WARD

+2

Hello @ H0WARD)でも公開されています。エクスポーズライブラリセクションの最後に表示されています(https:///webpack.js.org/guides/author-libraries/)にはバグがありますが、回避策もあります。 –

関連する問題