"scripts": { "android": "react-native run-android", "ios": "react-native run-ios", "lint": "eslint .", "start": "react-native start", "test": "jest", "build-release-ios": " react-native bundle --platform ios --entry-file index.js --bundle-output ./dest/bundle/index.jsbundle --assets-dest ./dest/bundle --dev false ", "build-debug-ios": " react-native bundle --platform ios --entry-file index.js --bundle-output ./dest/bundle/index.jsbundle --assets-dest ./dest/bundle --dev true " },
npm run build-release-ios 或者 yarn build-release-ios
指令執行完成後,打包的產物是放置在了./dest/bundle/目錄之下
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { return [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"jsbundle"]; // return [self getBundleURL]; } - (NSURL *)getBundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif }
在iOS項目中,根據不同的業務類型加載不同的模塊名稱
RNContainerController * containerVC = [[RNManager sharedInstance] loadWithModuleName:@"News" initialProps:@{}]; [self presentModalViewController:containerVC animated:YES];
"build-debug-ios": " react-native bundle --platform ios --entry-file index.js --bundle-output ./dest/bundle/index.jsbundle --assets-dest ./dest/bundle --dev true "
因爲我們平時寫的RN模塊中會使用到圖片,git,json文件這些資源,所以打出的產物也包含了js文件和資源文件。
//1.全局變量定義 var __BUNDLE_START_TIME__=this.nativePerformanceNow?nativePerformanceNow():Date.now(),__DEV__=true,process=this.process||{},__METRO_GLOBAL_PREFIX__='',__requireCycleIgnorePatterns=[/(^|\/|\\)node_modules($|\/|\\)/];process.env=process.env||{};process.env.NODE_ENV=process.env.NODE_ENV||"development"; //2.require, clear全局函數聲明 (function (global) { "use strict"; global.__r = metroRequire; global[`${__METRO_GLOBAL_PREFIX__}__d`] = define; global.__c = clear; global.__registerSegment = registerSegment; var modules = clear(); var EMPTY = {}; var CYCLE_DETECTED = {}; var _ref = {}, hasOwnProperty = _ref.hasOwnProperty; if (__DEV__) { global.$RefreshReg$ = function () {}; global.$RefreshSig$ = function () { return function (type) { return type; }; }; } })() //3.RN模塊定義(包括RN框架自己的,第三方庫的,用戶自定義的) __d(function (global, _$$_REQUIRE, _$$_IMPORT_DEFAULT, _$$_IMPORT_ALL, module, exports, _dependencyMap) { xxx xxx xxx },544,[1,262,306,21,50,91],"node_modules/react-native/Libraries/NewAppScreen/components/ReloadInstructions.js"); __d(function (global, _$$_REQUIRE, _$$_IMPORT_DEFAULT, _$$_IMPORT_ALL, module, exports, _dependencyMap) { var _interopRequireDefault = _$$_REQUIRE(_dependencyMap[0], "@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = News; var _react = _interopRequireDefault(_$$_REQUIRE(_dependencyMap[1], "react")); var _reactNative = _$$_REQUIRE(_dependencyMap[2], "react-native"); var _jsxRuntime = _$$_REQUIRE(_dependencyMap[3], "react/jsx-runtime"); var _jsxFileName = "/Users/admin/Documents/MyFile/react-native-container/src/News.tsx"; function News(params) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.SafeAreaView, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, { style: { color: 'red' }, children: "Hello ReactNative" }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Switch, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, { children: "\u5F00\u5173" }) })] }) }); } },545,[1,50,2,91],"src/News.tsx"); __d(function(global, require, _importDefaultUnused, _importAllUnused, module, exports, _dependencyMapUnused) { module.exports = { "name": "AwesomeProject", "displayName": "AAAAA" } ; },546,[],"app.json"); //4.require方法調用 __r(54); __r(0);
從上面內容可知,jsbundle有四部分組成: