blog

WebpackベースのReactパッケージングツールを書く (5)

は、npmパッケージをコンパイルするために使用され、現在、多くのツール、rollup、gulp、およびwebpackをパッケージ化するために市場に出回っています。...

Oct 21, 2020 · 5 min. read
シェア

ビルドパッケージ.js

const { spawn } = require('child_process'); const path = require('path'); // スクリプトを実行するパス const runtimePath = process.cwd(); // スクリプトへのパス const codePath = __dirname; const commandPath = path.join(codePath, 'node_modules', '.bin', path.sep); const { getEnv } = require('./util'); // buildpackage生成されたディレクトリ名 const generateDirName = 'lib'; // buildpackage元の名前 const srcDirName = 'src'; // コード出力パス const outputPath = path.join(runtimePath, generateDirName); // コード・コンパイル・パス let compilePath; let index = 0; // buildpackageすべてのタスク const tasks = [ // 生成されたディレクトリをクリアする clearTask, // babel変換する、変換するjs babelTask, // gulpTask, ]; /** * clearTask * 出力ディレクトリをクリアする * @return {Promise} */ function clearTask() { return new Promise((resolve, reject) => { const command = process.platform === 'win32' ? `rimraf.cmd` : `rimraf`; const rimrafProcess = spawn(command, [outputPath], { cwd: codePath, encoding: 'utf-8', env: getEnv(commandPath), }); rimrafProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); rimrafProcess.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); rimrafProcess.on('close', (code) => { console.log(`rimrafClose ${code}`); resolve(); }); }); } /** * babelTask * srcをlib * @return {Promise} */ function babelTask() { return new Promise((resolve, reject) => { const command = process.platform === 'win32' ? `babel.cmd` : `babel`; const babelProcess = spawn( command, [ // コンパイル済みディレクトリ compilePath, '-d', // 出力ディレクトリ outputPath, '--ignore', '__tests__', ], { cwd: codePath, encoding: 'utf-8', env: getEnv(commandPath), }, ); babelProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); babelProcess.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); babelProcess.on('close', (code) => { console.log(`babelClose ${code}`); resolve(); }); }); } /** * gulpTask * @return {Promise} */ function gulpTask() { return new Promise((resolve, reject) => { const command = process.platform === 'win32' ? `gulp.cmd` : `gulp`; const gulpProcess = spawn( command, [ '--outputpath', // 出力パス path.join(outputPath, path.sep), '--compilepath', // コンパイル・ディレクトリ path.join(compilePath, path.sep), ], { cwd: codePath, encoding: 'utf-8', env: getEnv(commandPath), }, ); gulpProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); gulpProcess.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); gulpProcess.on('close', (code) => { console.log(`gulpTaskClose ${code}`); resolve(); }); }); } /** * loopTask * @return {Promise} */ function loopTask() { return new Promise((resolve, reject) => { if (index >= tasks.length) { resolve(); } else { const task = tasks[index++]; if (task) { task() .then(() => { loopTask().then(() => { resolve(); }); }) .catch((error) => { reject(error); }); } else { reject(); } } }); } module.exports = { /** * build * @param {String} - srcPath */ build(srcPath) { if (srcPath) { // 指定されたコンパイルディレクトリ if (path.isAbsolute(srcPath)) { // は絶対パスである compilePath = srcPath; } else { // は相対パスである compilePath = path.join(runtimePath, srcPath); } } else { // コンパイルディレクトリを指定しない compilePath = path.join(runtimePath, srcDirName); } loopTask() .then(() => { console.log('finish'); process.exit(); }) .catch((error) => { console.log(error); }); }, };

gulpfile.js

const path = require('path');
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const sourceMap = require('gulp-sourcemaps');
const copyexts = [
 'less',
 'css',
 'svg',
 'jpg',
 'jpeg',
 'gif',
 'png',
 'bmp',
 'json',
 'eot',
 'woff',
 'ttf',
];
const commandArgs = require('./commandArgs');
const argsMap = commandArgs.initCommandArgs();
const outputpath = argsMap.get('--outputpath')[0];
const compilePath = argsMap.get('--compilepath')[0];
/**
 * copy
 */
gulp.task('copy', () => {
 for (let i = 0; i < copyexts.length; i++) {
 gulp.src(path.join(compilePath, '**', `*.${copyexts[i]}`)).pipe(gulp.dest(outputpath));
 }
});
/**
 *  
 */
gulp.task('minjs', () => {
 return gulp
 .src([
 path.join(outputpath, '**', '*.js'),
 path.join(outputpath, '**', '*.jsx'),
 ])
 .pipe(sourceMap.init())
 .pipe(uglify())
 .pipe(sourceMap.write('.'))
 .pipe(gulp.dest(outputpath));
});
gulp.task('default', ['copy', 'minjs']);

buildpackage.jsはnpmのパッケージをコンパイルするためのもので、現在市販されているlibaryツールのパッケージには、rollup、gulp、webpackがあり、libaryのパッケージにはrollupを使うのが一般的ですが、私は古いgulpを使ってパッケージングしています。パッケージングに古いgulpを使っているのは、もしかしたら昔から使っているものかもしれませんが、以下のlibaryの種類は、個人的にはlibaryは2種類に分けるべきだと理解しています。typescriptで書かれたnodejsのパッケージは、もしコンパイルが必要なければ、実際にコンパイルが必要なのはブラウザのライブラリです、jsとjsxファイルはes7~es9の新しい構文を使用する可能性があるため、これらのファイルをコンパイルするためにbabelコマンドを使用する必要があります。この2つの操作の後、libディレクトリが作成され、lib内のファイルの構造はsrc内のファイルの構造と同じですが、jsxファイルは同じ名前のjsファイルになり、jsファイルの内容はbabelによる変換の結果です。ファイルに変換され、それ以外のファイルはそのまま出力されます。というのも、babelがjsやjsxを変換するとき、import 'xxx.less' をパースできないからです。xxx.json' を導入することができません。これらのリソースファイルはホストプロジェクトでインポートされ、ホストプロジェクトのwebpack設定を使って解析される必要があります。

github

Read next

オーディオ乗算(wasm)のフロントエンド実装

職歴 教育系企業でライブストリーミング事業に従事。現在、音声の新しい再生方法を模索中。今まではFMP4へのコーデックを使用し、MSEを通して音声をストリーミングしていましたが、一部のPCでは音が再生されないというユーザーからのフィードバックを受け、pcmを再生することで実現する新しい再生方式を使用しています。sonicを採用した主な理由は...

Oct 21, 2020 · 7 min read