I have the same problem. This webpack extra code was breaking my global namespace and my global variables were not working when using then inside my <script> tags.
I tried Desmond Lua answer but it failed with bunch of errors. To fix, I stopped using webpack and started using gulp, gulp-concat, gulp-typescript:
packages.json
{ "scripts": { "gulp": "gulp main" }, "dependencies": { "@types/gulp": "^4.0.6", "@types/gulp-concat", "@types/gulp-typescript", "gulp": "^4.0.2", "gulp-concat": "^2.6.1", "gulp-resolve-dependencies": "^3.0.1", "gulp-typescript": "^6.0.0-alpha.1", "typescript": "^3.7.3" } }
src/someimport.ts
class SomeClass { delay: number; }
src/main.ts
/// <reference path="./someimport.ts" /> someclass = new SomeClass(); someclass.delay = 1;
This main gulp task (on gulpfile.js) targets only the src/main.js file, resolving all its /// <reference path=... include references. These includes are know as Triple-Slash Directives and they are used only for transpilers tools to combine files. In our case, they are used explicitly by .pipe(resolveDependencies({ and by typescript itself when checking the file for missing types, variables, etc.
- https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html
- When do I need a triple slash reference?
Refer to https://github.com/ivogabe/gulp-typescript#api-overview if you would like to customize the var tsProject = ts.createProject call and not use a tsconfig.json file or override its parameters.
gulpfile.js
var gulp = require("gulp"); var concat = require('gulp-concat'); var resolveDependencies = require('gulp-resolve-dependencies'); var ts = require("gulp-typescript"); var tsProject = ts.createProject("tsconfig.json"); gulp.task("main", function() { return gulp .src(["src/main.ts"]) .pipe(resolveDependencies({ pattern: /^\s*\/\/\/\s*<\s*reference\s*path\s*=\s*(?:"|')([^'"\n]+)/gm })) .on('error', function(err) { console.log(err.message); }) .pipe(tsProject()) .pipe(concat('main.js')) .pipe(gulp.dest("build/")); });
If you wold like to target all your type script project files instead of only src/main.ts, you can replace this:
return gulp .src(["src/main.ts"]) .pipe(resolveDependencies({ ... // --> return tsProject .src() .pipe(resolveDependencies({ ...
If you do not want to use typescript, you can use this simplified gulpfile.js and remove all typescript includes from package.json:
gulpfile.js
var gulp = require("gulp"); var concat = require('gulp-concat'); var resolveDependencies = require('gulp-resolve-dependencies'); gulp.task("main", function() { return gulp .src(["src/main.js"]) .pipe(resolveDependencies({ pattern: /^\s*\/\/\/\s*<\s*reference\s*path\s*=\s*(?:"|')([^'"\n]+)/gm })) .on('error', function(err) { console.log(err.message); }) .pipe(concat('main.js')) .pipe(gulp.dest("build/")); });
packages.json
{ "scripts": { "gulp": "gulp main" }, "dependencies": { "gulp": "^4.0.2", "gulp-concat": "^2.6.1", "gulp-resolve-dependencies": "^3.0.1" } }
Then, after running the command npm run gulp, the file build/main.js is created with the following as its contents:
build/main.js
class SomeClass { } /// <reference path="./someimport.ts" /> someclass = new SomeClass(); someclass.delay = 1;
Which allows me to include it in the browser with the script tag, after serving the build directory files:
<html> <head> <script src="main.js"></script> </head> <body> <script type="text/javascript"> console.log(someclass.delay); </script> </body> </html>
Related questions:
- https://www.typescriptlang.org/docs/handbook/gulp.html
- Can I use the typescript without requireJS?
- Gulp simple concatenation of main file that requires another JS file
- Client on node: Uncaught ReferenceError: require is not defined
- How can typescript browser node modules be compiled with gulp?
- Concatenate files using babel
- How to require CommonJS modules in the browser?
- Is there an alternative to Browserify?